今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
6 v% {0 K, y! e9 N" `: C. B! g
* _# e$ h" U2 _$ x5 l" i- j( b. k# g1 p1 p" Q% r
Warning: 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
& y/ l9 C3 h3 W Y7 l! KWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
/ ?& i) X, r# \# k7 dFatal 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" z5 `. o. p4 y" y! o2 J
8 q$ z( h, L% j. _# h: M0 C' \5 S
( C I2 O. L* A* g
) N! `2 |0 e2 R$ u+ T6 R9 ^
c- Q0 x# C4 n& ]0 w2 D6 F8 U
9 l8 d' C& l: I" X或者报如下类似:
N& N4 {: M. M: k" H9 i$ hWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
; E) G8 d* e9 ~
6 K8 _. l9 N/ L! v2 c! s j出现问题的原因:
/ H( V+ N( k- N$ P: \0 P# q& b查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件; i8 M4 x% [# r( d7 k. ~
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!) u) B) t h) a7 s# h. S
- k% q! I5 q$ n0 y9 G1 v
解决方法:
6 F5 O/ r' V ], p5 k, C我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
5 x E% C& G$ n0 Q0 c0 W2 _ U! p
* Y: j9 J9 ~" } V% g9 A如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?( S( `2 e9 y9 u) E
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
5 v, e4 m/ ]3 J/ H9 E2 d
2 r# } t% l4 _9 a, D一、php.ini 修改方法
! H1 s( |$ H' F0 O把权限作用域由入口文件目录修改为框架根目录- ]+ _+ s& ^$ r# d
. _) O# f0 x& J E" S打开 php.ini 搜索 open_basedir,把
" F F2 u1 m$ ]( U) L
* i5 x v: g4 ~) d: c) ~
3 n7 w% u. e$ H; m7 V; L+ Nopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
0 v H% m$ }( r7 T0 C( v. [! x7 k! r! y9 L5 b
修改为
+ s+ s4 J2 |! s3 {$ m
; `8 V3 H6 d2 N/ F/ Y' v! }. W$ _
1 j' Z2 j# C1 `, w/ T( wopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
7 J2 U$ N9 D X1 v7 q" \" o
+ [* q! s3 F' K2 ~8 ^
6 F0 `4 M1 m0 x+ E注意:2 C" ~7 g% W- }! P# b
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。8 n. S5 a7 R1 Q* M5 f" q* A
7 q; M0 S8 w0 o0 \7 n* A
二、Apache 修改方法
1 \" p4 B* n, N2 J1 MApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件! @+ M& K1 M& t( ^
! g# D7 U$ o) p
apache
' Q! f9 _/ t# O% E5 p# v- x├─vhost! ]0 {8 V( J0 k2 i
├─www.thinkphp.cn.conf
8 J- S2 d, {/ \) z├─......
% r( Y/ n' k5 I2 V7 ^2 U% z├─httpd.conf
7 }- J0 N0 t2 G! Z. A, B1 J0 j# ~
: k! @% K* L8 Z0 u( y$ z
% `# R- v* |; f& X' n5 g& ]+ `打开 你的域名.conf 文件 搜索 open_basedir,把
' T* ?& z2 Z" i2 z/ _$ U
6 @ w/ g1 T5 A6 l1 p# q, S L4 l' d6 \4 k# e5 [) b% s" s
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"8 L0 V( P, T4 b; F: O
- }' h! r: _' \
修改为# \9 g+ ^7 T* K- _3 c" s
( \! H7 b) y3 D$ ^* }2 O
: Y4 Q% m9 G t1 V; Qphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
7 ]0 T7 ^+ S( Z% J0 |5 {- N4 b" I4 Z6 e6 }8 r: s2 a3 m; N, w D8 U
4 T' F+ q1 E# U1 Z$ y
然后重新启动 apache 即可生效
# R9 }# d- ?- B( y4 r! o> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
, C& K& k* \+ t5 x4 x: x8 L. c/ N; ]
三、Nginx/Tengine 修改方法, s8 j) ]% l: T- E, @; A
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件) v6 S7 A) P3 ^1 C ]% X* n
y3 f% X/ T& V/ N5 \" |
nginx
! E1 \: }& S0 V- e# k( v0 H├─conf: A2 d0 E# w; W7 a$ i2 X1 F
├─vhost" d& B; ^7 V* H! U# f
├─www.thinkphp.cn.conf) ~) e, `) b6 n* H# s
├─nginx.conf" b4 T* Q, ~4 ]1 I/ e
├─......- F" \5 R; M( g$ j4 F
├─nginx.conf y( Q) K- Z: X- d+ k( \$ {& X1 V
- H! Q6 C( z) b+ g
& N4 P+ V n% g5 l) B' R! ]打开 你的域名.conf 文件 搜索 open_basedir,把! e# L, t/ Y0 F& V) A
+ T1 {6 [" ~' ^6 C
9 {0 p7 V* G! H% k2 z% {
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
9 W9 q" l$ h5 d5 D4 A, j! }6 g M/ c! }' a% w; s1 o% f4 X
修改为! J" ]# k$ _9 h1 j* a
$ ^1 @" v4 N; X* O
. U) R8 w4 e& w0 G- ~fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
* P" X& c8 o5 } h& a4 c8 G8 f( m i. R1 @
+ S' ~! N& [6 F- s/ r% H U
然后重新启动 Nginx 即可生效
1 J9 X7 s( t7 o5 j2 D. b+ n域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
& M8 t* X5 o3 o. I( T# _8 X) }
# V |: u0 J% T: \) d J注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):) B$ s4 B4 ]5 T k( C
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
& }/ B0 k' a* r1 r) i) V, ^3 f上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
" L, `$ e/ |+ o7 W依然会生成错误的配置如下:# g3 {( J. P& ^; x
5 w' q! L3 I( r+ D+ o+ N; m+ C0 [# ^3 @. s" h' F
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";2 {! D3 R' f. ^4 g4 N
0 w( H) n4 U7 a) N! ? i" a
% v2 j. G. e: G9 f
四、fpm/fastcgi user.ini 修改方法+ g, h" j% k/ e# Y# y
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把4 ^8 W* o4 w0 x; k# a
5 s3 i& A# T% }
6 {9 @; s8 y( Yopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
7 W' b4 o" w, R* J8 J& b' G
8 q% F5 q$ f6 J3 T! R' m修改为0 ]6 C. f) ~" |' S
7 @3 `2 `. s, J1 J
0 m+ }2 _+ Z; Q# G% nopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
, D& N1 U! d5 C0 F# d% |5 O6 X
' W$ ^2 V) {' i) p) J
* ^- U1 a' @3 G0 S3 ?! r3 q& Q/ Q然后重新启动 web 服务器 即可生效!
- t$ }. J0 h' n( _; Z. r
5 B3 C. X- u0 {3 E+ y& C9 L3 c7 ?总结:: l( L, Z @ i" D" D- p
一定要仔细读此篇文章,否则你会选错适合你的方法。* b: I- H {. ]4 I2 [; V# @
一定要根据自己的服务器环境来选择你的修改方法。2 y4 O5 u( m6 o @$ S- j$ y: t7 q# m
" ]1 k: x: G- q7 R8 A) P* {" b
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
, O4 f# P, U/ ?+ ]: ^+ k5 G: k* w. k( {% R2 B- F @
5 o1 j$ ^! |8 G
( I# C1 A! r# Z- o( Q最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
& s2 h- i2 n8 ?3 h. M/ B6 y4 N宝塔面板出现“open_basedir restriction in effect. ”的解决方法
: T6 i2 G+ O! G+ Z! ` ~2 \1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
) P. F: R0 ?1 I, l C& H2、必须重启PHP;9 M$ T/ u2 E& Y: ~! W# j
4 r& D; }" u; b% b* X b0 K7 C9 C8 a& e3 V
. Z: Y/ V8 ~8 ?% k) s5 r# d& H5 ?# z
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
9 V% p' g5 Q6 n* k+ B我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;# o# ^3 l. t/ X& B% c
- j9 M- T/ j- W2 T我的解决方法其实和文章也差不多,原理都是一样的:
) @+ h8 d8 l1 T7 O+ A) K* Z# E$ p$ x. }" Z
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
" z$ f3 Z3 j# L- QLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置; R5 [4 \0 R3 B5 ?* o
4 J$ Z, R8 R& s8 d6 P s$ ]: p4 `
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
- o4 J- L: r. ]) v! h, L9 C
, v; T9 D5 L$ h' B! ^.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini8 `' f$ @) j5 a7 U* n6 ?# w0 r
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。$ e9 W& b3 q7 d) i
删除的话rm -f /网站目录/.user.ini 就可以。, |1 [ o( ?# ~+ v: K, ^
修改完成后再执行:chattr +i /网站目录/.user.ini
) \: P2 H6 t# I& u.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。0 d: n5 Q- ^- U, x$ a; R& O
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!6 g. W4 L+ r6 Z0 a2 h2 c- f
$ r5 c0 K$ o* j, Q' ]6 k2 A/ OLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
3 j/ {# @ B4 ]3 r+ _/ U- _+ d1 g4 [! Z4 r& b7 Q
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
# R$ N) `0 p* D) i$ m% K* @在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。$ T {3 ^! x* ~8 @
5 e$ @1 N0 }$ n, k
- m7 U! Y! Z' N( F4 X* W
/ y+ @3 F2 ?$ d5 w! W
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。: o6 Q+ a3 x, d/ j) j
6 d) x) ~4 _: @
重启apache生效。 |