今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
7 T$ C# ^9 H9 k" g+ e x5 s: a
2 S5 I$ Z9 e. Z
) T( {8 C% Z* v' w- ^8 UWarning: require(): open_basedir restriction in effect. File(/www/wwwroot/zhuyuyun/thinkphp/start.php) is not within the allowed path(s): (/www/wwwroot/zhuyuyun/public/:/tmp/:/proc/) in /www/wwwroot/zhuyuyun/public/index.php on line 20% j% X& F. _0 T' c( ]& m( A& Y
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20; _4 t1 z/ s' M f
Fatal error: require(): Failed opening required '/www/wwwroot/zhuyuyun/public/../thinkphp/start.php' (include_path='.:/www/server/php/56/lib/php') in /www/wwwroot/zhuyuyun/public/index.php on line 20- H8 }% N- G7 ~5 T( i a
* t7 @3 T6 J. M) T2 r1 Z; a& q6 K
2 ` N, ]% @3 U8 V/ M) A$ ?8 u4 m
2 a+ ?( Z \6 @% V6 b, ]! Q4 w% H8 \+ U5 Q/ p1 H/ b6 ~$ Y
B N7 G" p& `或者报如下类似:
% a; ?7 U- [ r7 W; x+ C3 hWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):8 O8 n! W' M( n* j6 K
7 P$ v! ]/ f7 b; E: y% o出现问题的原因:
0 c1 F. r% N8 }4 i4 E r查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
# G, \& n( i0 z1 \, J一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
" _- X3 Y! S" [
# z' i' E. q8 }* w1 n解决方法:
6 ?* a2 [# I9 R- }) Q# ^1 Y! {我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
& X4 R+ N) i- G! V0 j+ s5 g1 r! }* c/ u" H' O" x
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
. t. N& j q# E4 j# `9 S打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
8 H6 C2 ^) J& S: f" L; u, ~) B' g+ {; c# x, t: a
一、php.ini 修改方法
) p* b4 y. l/ P8 M把权限作用域由入口文件目录修改为框架根目录" n0 `# q" o! \" z. ?/ ` Q5 Q; x( Z
0 g j/ G9 c" r; q9 c
打开 php.ini 搜索 open_basedir,把5 e/ e" T: N! r6 e
- X+ {0 p, G$ J! I, t% j( e( C1 _% M0 a: E& H( ^1 d
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/") i5 D1 V4 q- d7 d
o# k: |$ `- {- b+ t- f修改为
+ `4 i- c, i; K: q* V+ N2 ]; r
" Q) T+ D# F. o6 o
+ I1 g8 \) N$ ropen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
. H% s! s* W/ j/ ]% t6 n' V8 Y3 L: G( N6 P: `1 v
+ _% K* P* [/ i- l) S$ J* ]注意:
8 n& {& j* W3 m9 K" g如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
) a% `0 J" j; e* q( T
; H$ o0 E% ]5 f8 i4 u二、Apache 修改方法
* H6 y4 f- `1 [6 }, ?- J) [Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
7 M. `1 h5 A+ v8 R
1 a9 {! d# R: f Z& [) wapache/ n1 n" |8 p+ f: `/ P
├─vhost
3 V; J) u3 |9 t7 H' a9 D% V├─www.thinkphp.cn.conf/ ]% p6 Z- l: a2 @: N
├─......
& K7 s7 n% W g& n├─httpd.conf4 f1 [' A9 n# i' g, [
K' ~4 v6 b `1 P' f( y7 \ z5 Z( m: E; _" y& e- @! i
打开 你的域名.conf 文件 搜索 open_basedir,把
& ? \, h; q( A j6 N7 H& v& c# C: v7 G0 a4 X
( A" t- @/ o1 m3 I- W+ t: p4 W; Kphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
( \+ D4 a0 c6 w9 |2 ]" u5 I6 h5 Q3 Z, k! Y( y; f- G
修改为$ j4 P8 Y) J* v9 G
, h3 A6 J+ b& V5 a6 g6 x0 K4 H5 o) H& F8 v T
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"9 a' M* T! {0 Q- `, z, b/ u8 m- J
# w+ Z4 z: p; K2 S/ w
; F" W7 l( N j1 ^8 g) v然后重新启动 apache 即可生效
7 z" U% e- u8 v> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置7 g# G" D; h1 [: U0 ?; P
3 _3 S- ~; V8 n' F+ S
三、Nginx/Tengine 修改方法) M$ H: O+ K+ }5 A" E' G
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
" ]5 f1 n$ m. d% ]+ A7 l; _/ c( ~
: I; V! v$ \: s2 f5 [/ X$ Vnginx- D3 z2 S1 D$ S$ h' O! ^3 t) n8 Z
├─conf' p% J2 g4 r) L8 D$ V! J
├─vhost
+ `) W+ r, r( I, |) F1 O6 w├─www.thinkphp.cn.conf4 X7 x! ^0 q2 U$ y: V
├─nginx.conf( R& k/ p8 g/ j4 ~) G% J% u, x5 ]# ?
├─......$ e4 l; o9 M( j! x
├─nginx.conf
# r' _+ A+ }1 b$ L3 i/ B3 j' q3 p7 O9 M" K7 C% u
, f* n. {5 B( x8 n9 v打开 你的域名.conf 文件 搜索 open_basedir,把
% J1 M/ b8 h7 [. c; z" h1 {5 w$ F; z8 {5 R6 [/ B- K2 M0 J
) ?. E6 T1 E# B! z( f! B
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";( T4 H# p+ d# [" ?4 }9 J; d
% S: Y" x1 D- X7 `* W! r' y修改为( z! @% g& Q' S, A, I
# M, O9 U5 w6 \ U
) s1 v: f* J6 rfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";/ |; G" b* U8 x/ M
3 j. o$ b1 H6 d" `3 r' q" t ?1 f: E/ @# b; J# l4 K
然后重新启动 Nginx 即可生效6 \# b6 q S6 r6 Y: V
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置) r/ n# o0 y ~. i* b, J" _
) n. m: k* k8 |注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):7 y+ w/ |& T9 t; R" R) \
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; ~" C) u! f5 E7 f' [ h6 e6 V( L
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;; f! h. A' e8 d/ d1 J* {
依然会生成错误的配置如下:
8 i, B& ^+ @% V) ~) I9 s% V8 Z( g2 | R
A* S: c4 t! ]fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
2 z% @5 I) t; w n4 s" f1 L+ f' V, ?% o0 t, Q5 t
$ }5 t7 r0 O5 b1 t" W( N$ F3 ^$ ^四、fpm/fastcgi user.ini 修改方法
^$ T0 H& K* u A打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把% f* I* ~/ O# g/ H& c' g/ Z
. x* I7 U. K9 H9 P6 X
1 s3 x& N, e& }# m" z) y3 |/ g! [
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
& P" B) ]/ e2 r" o; O. `
5 t; C+ l7 _- O- C# \6 p) ~修改为
6 \% M. m2 _4 K0 N3 E/ W; Q& E
L* b6 F2 [8 M' ]3 o( Z' ^8 C- R% K4 ^6 m" ]5 A
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/& c6 L5 e5 E/ Y- I7 @0 r
- o* t' w+ ]) X) R
$ _9 U5 M, @ O然后重新启动 web 服务器 即可生效!
3 Z* |- G, P( X5 T7 M
; N0 v9 g4 ^3 l4 |总结:
1 Z( Y6 j, c8 i( n; B, t一定要仔细读此篇文章,否则你会选错适合你的方法。9 w# Z, {* i9 {
一定要根据自己的服务器环境来选择你的修改方法。$ A& T0 ]# K) C$ V5 m
6 M$ n; f" K: Y% n
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!4 k5 w$ y _+ P
# f2 R% B5 o1 B6 w- P8 n' r
3 P7 b" c% i7 I) m( N. e9 y
$ i0 j% X" j$ |6 I+ v% c( A
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。2 y' R% d- I: k" Z! t1 j
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
) l% u: P1 _' w' Q/ w- I6 A1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
- H6 K( o/ u6 B2 ]: U; `1 n4 L- E2、必须重启PHP;3 c/ E3 w/ C% m/ V# u
! S3 O+ L1 N/ W, N2 z! H- z
8 g6 m$ W* d4 r$ T& ~' t7 n8 p$ f4 V( O
4 ^( n/ o3 l9 d/ `LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法0 b. X" J3 v! L
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
1 K4 I" E x/ t& Y
J8 Z" H7 [ ` K9 \我的解决方法其实和文章也差不多,原理都是一样的:
. J7 J! H3 v1 B" o0 b/ j0 Q) O& M
$ t3 u2 F( F8 e2 Q+ B7 @0 d5 X# T我是看到LNMP官方提供的“防跨目录设置”方法,如下:
7 ^# ]+ ^" [" n2 t( h) p* N0 [LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置8 _) b5 r# F% n& f
; R# |4 v3 f y* N4 gLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。# X* }3 V5 r. B3 x4 y( n) ^
0 Q! T5 d+ U: W.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini5 b& ?+ }5 S& y: I, i
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
5 Z5 z* X( y% ]) r: {6 j删除的话rm -f /网站目录/.user.ini 就可以。7 K2 F4 a2 R8 B( K
修改完成后再执行:chattr +i /网站目录/.user.ini" H+ G: o& o, j9 b% |/ E
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。& w9 t# o' ^1 i$ S, n* `4 \
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!3 Y* Q }1 }9 Y
" S) _: v# g. Y. U/ N
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
% x* T: x0 k% V% k
7 `& b/ K, t" K8 u% wLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
! L/ A. w/ x* L: ~3 g: _5 J" G$ S在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。% |/ N& e% T$ Q( I" z4 U, \
" ]2 i6 [# H# T* ~1 S0 x8 h
: U& g2 w# m: h r3 g
4 w0 \5 A/ n Z1 [( O- G5 SLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
5 j7 j+ p! g" n, _: {' j6 ^5 E! |
重启apache生效。 |