今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下: w) D9 G& J, e5 b! o* R
9 t. W1 G$ T3 W7 C
4 a4 u: I1 N0 Z$ h( J/ U0 v3 JWarning: 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 203 `! J6 j7 L2 j5 q% E8 k
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 205 r, t% [$ x3 _5 d3 e, V# Y; q. h
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 208 T- X' [1 D. y
! t: m. b; \6 C
1 S* D. g2 K/ ~7 L% Y8 F4 s$ e7 B2 w# V; m
* A1 W& ^/ m5 Y Q- ]) T! \/ u3 v5 O' E: n8 @
或者报如下类似:! o/ _- P4 ~( R% R% K1 O8 M1 _) }
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
- d# z0 K- o# d* n; D4 h1 R4 L8 X# _$ k) c& ^
出现问题的原因:# y7 z/ d" i- J
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
9 J; r- ]! o) W1 z, j1 j一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
8 t# z5 v" C) q* v1 [0 s
7 l. l- Y% ?* }1 ?& ~" e解决方法:
" r; }+ ~0 w* J我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。6 ]* }7 a, |; |/ Y! d' y& X
; c8 o6 u% p- s4 T/ {
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
/ t' _3 ?$ \; W, b) v6 k3 w) `打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
: x" v6 p$ P" ~7 d+ r
) k# E! q5 ^& B+ T1 G V m一、php.ini 修改方法- F9 A9 c6 A1 x6 G+ F2 m; _
把权限作用域由入口文件目录修改为框架根目录
# E+ _4 x$ z( o7 S% \6 Q
; O& i8 K- e; E. R0 M. O; }! O打开 php.ini 搜索 open_basedir,把
1 f5 F1 R) y R: x7 `3 v9 P% J$ J& Y$ t! P3 q1 k
" N+ }" |7 f9 ~# R3 ^. hopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
! b! H2 w* V8 j; U
# `! Z( \7 [0 v1 M1 N0 R( k修改为
, h# ^7 Z" b9 b# C
- C; a% d0 v' J) f/ D
. G! V0 u- d3 a3 h" vopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
1 ~1 {% ?! b& R
1 n6 t1 A1 C' O3 t- T" p1 X! I& f) k" j) \# x3 S$ L7 p& ~
注意:
* v: j/ W! [ y1 C3 ~' y, N如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
/ m/ T+ s' V1 u8 S+ y+ B# r' I1 _, ~: s0 z' Y/ j
二、Apache 修改方法
" u& n: I' {3 o6 I- eApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件 Q. k* g0 S/ A, ?- I
2 {4 O8 ]2 \& w, h) t: [ capache
: g) x& X% B3 V├─vhost
, H: `( d7 C, r! m3 g├─www.thinkphp.cn.conf1 E- l% f: H; ^6 E' [/ N# a
├─......3 j1 w- M8 R+ Z$ M
├─httpd.conf
" Q+ E. e% j% ?, e |1 C: h& y4 e$ W% @( Z
. @% E( b& P% v4 ~) ] ~
打开 你的域名.conf 文件 搜索 open_basedir,把5 ?+ Z. G z* M; k/ \
& d$ |2 c( S$ [, S1 ~
+ q) V7 k9 j* i; |5 g+ m, Zphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
6 U2 |& ]5 E6 _% I. a9 q. Z/ `* y, ?/ Q- d$ ]) K& I/ o# e r
修改为
- F1 S% i$ Q) w" u( k1 |4 _& c7 m" y# c2 ^
/ Z1 A5 O! R. G1 v2 g
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
4 b& K( J* R j6 V; w9 `4 G( A8 D. ~! K* ^8 E+ T' q
- B6 \6 ?5 ~6 _8 K M7 w6 A
然后重新启动 apache 即可生效
; o3 y; B. {" B- i4 ?; g. X0 x> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置) I% I Q0 b( i0 Y6 s
- L" ^* N$ m: U7 N- M$ q三、Nginx/Tengine 修改方法5 |7 ]! d5 r+ f: a# a
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件; R e. S) O% g/ {. K! V8 t
# q z0 Y- o$ T: g& B; w5 xnginx/ e2 H- d K6 O/ F( w2 p/ ?. d
├─conf7 n- ~; q9 A' Z' \
├─vhost
5 _( b9 S7 ]0 r" t0 k' i4 j├─www.thinkphp.cn.conf; \% s* z3 w4 t
├─nginx.conf9 D! H! q7 l5 r" J {0 ?
├─......
3 Z0 D' d0 h8 [: T- n3 L6 _├─nginx.conf4 K) v |% j: Z$ L" \- V' z" R3 Q
' W1 e: j- \. X X6 z2 K% h+ ~
& l5 v( @) ?. h3 {+ Q打开 你的域名.conf 文件 搜索 open_basedir,把. [7 B/ n) X( j# P# k
( A* M3 c1 _; g& ^7 q
# z, C+ y* q+ L% ]" e/ {' |) e% |
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
& B3 ^6 ?+ }' S) P- o
& i; {4 b; r) n# h( D修改为; L* ~6 X' S) |( \. m
% o$ \5 J9 A; ]9 Q
- Q; M5 ?' U# c# p9 ~/ Qfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
% r' s/ n) | e) ^7 Q8 ~( w7 l8 E+ m2 p
( ~# }( i, ^: H, }4 Q, F3 Q& m然后重新启动 Nginx 即可生效3 b) s! R! m. ~2 p3 }: }6 f
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
4 z* {! w# H2 x9 A8 n3 ]1 q; k- R$ d3 B- y; @
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):8 T7 j6 M0 C1 \- d- q: b0 ^1 `' `. I
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
$ i' z" }) t7 _& s上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;; C! G; u2 ?1 k$ S, }2 e8 J+ l7 h
依然会生成错误的配置如下:( s& n6 ?; s, ]8 @% |$ z" |1 e! K
5 p- Q. L' S/ C0 Z. C- J3 T" J2 r: ^4 W { P
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/"; ]" u1 Z+ E: j
) ^, g& `, w0 N5 m& z N, B# M9 D, T( v; _5 o7 E; |/ L& \
四、fpm/fastcgi user.ini 修改方法: V- ^; i( w' I' ]. l
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
8 t$ ]2 `6 G0 p* q/ x
: K9 n* ?4 c5 N& v& Q3 y' N: J s" |+ t- {
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/0 _2 G1 Z/ X9 D) c! v# |
5 O. p- _* f* q) G9 B
修改为% G5 M! f& h6 W& v
! Y y! ~1 t8 W" z# E2 ~! a# r3 L+ M* J) G* \
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
7 i5 W4 U1 j6 i
( k$ T* x) ^1 k: [
; A: l4 z. G- M+ B) l然后重新启动 web 服务器 即可生效!5 o* g, b4 G Q3 R( R( p
/ g( x# `; _4 f" q5 e" w# w% v总结:
: C* ?9 D3 B, U一定要仔细读此篇文章,否则你会选错适合你的方法。
3 \" y8 X0 Q1 v5 N5 x一定要根据自己的服务器环境来选择你的修改方法。% Y2 q7 O) e6 b( i9 u3 E
% k0 Y: N! \0 E. e由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!$ R% w6 ?$ H6 F, t9 b
|7 h1 g" ^1 G0 l& I) [4 a7 M3 e
. h7 F: H1 d" _1 K4 S
5 {) @: e0 D, J最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
; s! A& A: m$ i8 y1 Y1 {2 T! l宝塔面板出现“open_basedir restriction in effect. ”的解决方法
3 r2 v1 p9 n! ?0 I. v1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
* p k9 [% x7 ^. r1 b/ t2、必须重启PHP;2 P3 s* h, I! j) z0 p- ]
! y: t. W3 I8 @6 m+ N: d% l' E
) f3 v" I. H6 s/ j4 [/ T
1 r" X6 L9 E* L9 V7 s4 \
8 ]$ O. a$ |0 n4 c* ?5 c0 mLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
! m" d) B( t, J; J8 A3 d3 k+ ^我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;4 P& v& B. G) _4 y$ r: D: B5 }+ n
8 w) E# N( _* z* ^. d9 ?我的解决方法其实和文章也差不多,原理都是一样的:1 W* o! G" _ N8 R8 t( N
, L0 G' |# g; x0 ]2 ]7 P3 L我是看到LNMP官方提供的“防跨目录设置”方法,如下:! Q" _. v; [: S* U2 w. W' O# C8 @0 |
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
- _& j2 ~7 r. `0 Y2 R4 b9 e
. w* m% |. ]5 Y* B6 |4 qLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。3 b' V$ ?2 f$ {! y, U) s
0 Q" N6 L2 Q6 X4 @2 x
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini/ k4 I# }5 O7 K, E
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
) B" S: P9 ^* w2 W% z L9 K删除的话rm -f /网站目录/.user.ini 就可以。: W& x9 I6 U8 q9 i8 B; v' _$ C, v* E
修改完成后再执行:chattr +i /网站目录/.user.ini6 W' L6 Z# \7 [) k
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
! Z) M0 T; F8 ]; C5 m如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
1 X5 F3 X- R& t2 k# q3 f; z+ |% V+ J$ i/ F5 r4 z; E5 G7 [
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。8 u( ?6 q8 Q( s% U& Z5 b
. R- F, a; [0 w( r5 `
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
, P8 o2 m2 W, M; d5 q/ c i2 r% m在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。2 R% ?! t. f9 r! v0 W6 U
2 y, p8 p: I& a. |0 M0 c
7 [8 `# y2 S( u( D* ]( Z. _1 N6 @( m
& l% f1 J+ L* D0 ~2 kLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
0 X A' B. z+ k3 |( U) s
1 t; P1 C2 m& {5 b! u! ^重启apache生效。 |