今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:: X6 Y) C$ L* V# }) b, t* j
% ^7 b5 w; C. |& {. F" Z$ X
% I" |' E3 L! S7 i0 q- y) z! yWarning: 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
9 R" g, \4 J! ~: |4 pWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20' d" c& u% r' A$ \
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
7 i" U2 x0 h6 [* g! v
% Q& n3 H3 O+ T- d( s: w
6 y' R1 s, O2 T. f' Y
* {4 [9 [7 h) `& C( X: i0 i/ H& L/ y6 h5 d) a4 X$ n4 L( Z
3 [% c J1 L% j1 K# e9 q或者报如下类似:2 _5 ?) M* }" O. T E; \9 N
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):9 F$ \9 D1 y; j* Q8 @
9 G6 A% k0 j6 M/ H% ?7 ?. j" z出现问题的原因:
8 P$ Y: E; f# q, a+ b* ?查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
$ k( w' T9 `( G% q一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
. _ s' b) I. |
0 r* | Z: c: ~+ {/ i解决方法:
6 F7 a8 y0 ~" i8 a G: m我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
$ }, a3 y6 y" q& [9 K5 V) P+ u; ^6 E% C+ H/ f+ c) e# t6 k" V
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
% z3 A) H) R1 j3 L2 U0 E$ X打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。. Z0 A0 F$ g- d6 `" G. r
8 a* f: {, j# a1 I% n9 c4 S( o/ ]一、php.ini 修改方法
" |0 R+ r6 v; X M9 y把权限作用域由入口文件目录修改为框架根目录
8 v; s8 e6 o2 S' P
6 l( F1 g* E7 w8 g# d% d3 I8 ~打开 php.ini 搜索 open_basedir,把
9 |: L& M" A" ?& t+ \& V$ M( f# m
8 \& ?! P' i, X
" `" D/ S& ^% P( Y) h# I" k. iopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
3 J% X5 ^7 z4 A! N0 H$ ?5 ~3 I3 y- d" `9 }' I" D$ Z6 r) X
修改为
! W1 I3 G! E1 {" g# y$ W6 d9 X l( _
/ l" i: T, s6 n, E+ u i3 ~9 Q j& Aopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
4 J( b/ U4 L- d
, q. s' ~5 N, y; c
/ ~ R; d2 w* Y: Q7 |9 [注意:
9 J! t& x3 R$ \+ A3 ]如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
) o6 l* ?0 M$ g4 g: g4 J$ y
1 h# l, D( J- b; H* m二、Apache 修改方法
# N; o# u* z0 H% P. O$ T5 v) U$ G" lApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件. i: G0 c8 b# D
: ` u, O' \4 Z/ V0 N$ \" b4 Oapache
: v' a- K5 s0 M4 G: u0 O( x├─vhost
! R3 y% H1 b t N. D├─www.thinkphp.cn.conf- @7 {) w( o: y* ~% w
├─....../ }& G+ b; q5 [+ T4 d. q% e! W" R
├─httpd.conf8 H1 e L' v/ H9 u6 t
/ f1 h- y s- h- `( y
8 z" v( y+ }2 z& }- v打开 你的域名.conf 文件 搜索 open_basedir,把* g i, m `8 r4 T
9 |/ y; C- T+ k' i, g
& u( n8 Y; L1 q( n) [/ ~php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"# e8 h( \; [; F: l, [
; Z5 @, P& }8 I, @修改为( ]8 ]. M; @+ C9 ~4 {
/ E5 [* t( \( M$ f
! R. a3 E+ f6 W0 h$ U# ]+ O) B
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"( E, [; J( R6 |, `: H0 `) q+ V+ ]9 ~
2 V0 h x3 {, R) O" v, L \( C6 S* A0 `' H3 D1 J
然后重新启动 apache 即可生效
' z) o. m8 i3 j) l5 Z3 V> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置5 A+ E7 {. C2 }% E5 }) @
. g7 l* N! x& Z/ Z1 M* b$ M$ X
三、Nginx/Tengine 修改方法0 a n& i1 l. M
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
4 V. H3 G2 V" G1 E. l
+ u: |! w' `# l, [nginx {& N1 R" K! ~* i" B
├─conf0 D: T( y: P+ T* r# \
├─vhost
; i/ a$ s6 l3 s' X* G, b├─www.thinkphp.cn.conf
! ~5 e1 O( V& r% U) _; k P├─nginx.conf& g0 ]# u6 m0 i: t
├─......
6 N. {" |9 B* C9 R├─nginx.conf
1 \+ o, l, z/ j+ h# U: d' n/ n
0 O9 {/ O! M1 p$ f; v @; D) `; B# v
打开 你的域名.conf 文件 搜索 open_basedir,把
5 v2 V5 c* E0 f8 P9 U; s$ p& n" D2 {4 w+ u
( H% q8 e# k8 }fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
6 g) l8 o. H2 A9 q4 F
3 t+ m+ I# `! e# a! A$ p2 t) D2 P修改为
, e* Y5 {" C- D8 D! | Z
/ i( G5 ]( E+ I a0 n% g! u" }$ F, F5 M5 T4 d h
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";0 {) M$ E$ R0 G, s% O7 \
3 E' r$ T6 b! o
6 p" Q& G3 B1 W
然后重新启动 Nginx 即可生效
$ b( W! Z# i5 d) B+ w4 j域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
8 `6 U& y0 P% S1 {$ z+ t2 K+ |+ ], q
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
% M2 L, g; h- Y0 s! k. u1 ^4 Ofastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";7 y& [: t+ l9 w* X9 q% A3 y
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;2 J. S6 @5 S* y1 e
依然会生成错误的配置如下:! C+ `0 [ v. \# T7 D
+ \0 F8 A: A9 ^4 F* e$ `
% a; k/ m n4 l T/ i" ?
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
[. \' d! ^' M7 k4 n8 u J+ t$ K
0 @1 m' T; v: b r4 I u6 N# s) Y/ u! j3 Z$ M3 p0 Y
四、fpm/fastcgi user.ini 修改方法
$ y0 c3 S R. Q( y% D ~打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
( t2 }- h* y! F% v- k0 f; S: V' g, {/ q8 n- L9 l: n0 I
5 p7 b) A2 n& ]5 uopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
0 Y3 ]: n; @: ^: H. u" x7 O4 |" @- _
修改为1 v3 X! O. E' P, A/ m
% e) _" @ C8 f0 T0 z9 o; O
3 h; x4 ?8 q' K% A8 f% ^$ C Xopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
5 B' @2 n. i+ H+ Z
1 P8 G) P8 Q2 x+ L
3 x1 ^; q: r, z然后重新启动 web 服务器 即可生效!6 Y' o5 `7 F1 H( |
0 c8 f, p; d' D! U# A/ _8 A6 C
总结:
/ W; m" j' d$ M一定要仔细读此篇文章,否则你会选错适合你的方法。. v# p* ]3 P1 o# B6 I6 r
一定要根据自己的服务器环境来选择你的修改方法。
# g h$ A: w3 t, J. g5 M' u7 J5 Q. d" Z2 }
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
7 w9 R! C0 i3 X# L: g. @# i9 u. N
' a' `1 Z# O& m( S3 {8 T8 y; C0 C; ~0 I
; a |; A# B( G0 q; y* o. T7 J& D
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
( d. |) q, m- l# `- ^宝塔面板出现“open_basedir restriction in effect. ”的解决方法
+ a0 G# Q$ V V) e( v% M2 s1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!" _7 m6 f: D0 b& R
2、必须重启PHP;8 h. K* ?. @" [2 g) G+ D0 s
?) a# }6 \" v3 m
/ }* k. B/ j% K9 D- ~" Y
% z" c7 i1 a D
) c( h$ E/ D5 h M+ KLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法: X2 |7 e" Z- ?8 t: H9 \) _( T
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;1 W7 y0 f f% b+ o
: M6 ^7 R" N- H k ]我的解决方法其实和文章也差不多,原理都是一样的:
6 _( p7 C- e4 Q, q- L; g: J& r8 t8 h- f! W+ e# H" a! a% C: i
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
7 s% H4 ^/ T N' U! ~' GLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置. B, M& j- t# u+ f" L4 \
2 F* a; ~( O% m( F6 i$ ?& xLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
8 A" S7 F# k; q, b, l* P( b$ D$ n( ~" N% I7 t) [; |
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
( j; R$ Y5 M5 m6 Z& ?- [可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。& j7 u) P6 m. t; S( s
删除的话rm -f /网站目录/.user.ini 就可以。
* L" z2 G* C$ ~修改完成后再执行:chattr +i /网站目录/.user.ini! T) o9 w0 G% C! H+ W
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
7 N" M: w( q6 o如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
0 m" l& ], x6 E0 {' ] A5 b- O" N V9 f7 R$ K
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。- k: v% v; m! i: C" D" I' D
1 [8 b& W- l7 P1 h3 u( t YLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
c: ]; N4 c( W8 l' J" Q在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。/ e0 r2 T( h3 g3 ]6 b0 n
# `0 [8 M" P3 P; ]" Z. J
% O1 e5 k( W- I
) R* D% F; D% s# z& ]) _4 X' A" WLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
T% _7 p7 d) R* B1 M5 w. h3 B/ e) @0 l9 ]! P' w( J
重启apache生效。 |