今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:1 D4 m& D, B/ S) r0 ]: J2 B* b% Q
! V7 T8 _3 n9 i, \+ b
* |, X9 O& K# }) I
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
7 |8 a) f# D {! X4 @$ QWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
7 L/ `; I c4 f; g8 h7 mFatal 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
/ M' S) U1 }6 W
6 _2 K; ~. W9 k6 J7 z+ L- `, L" b7 K- A. i4 O! A- G) o
+ C: L$ z! T8 e! L v: ]
$ _. _! b/ d1 R4 D( U, a/ c: i6 U- x% t/ Y& U g% j x8 Y
或者报如下类似:
" @0 [" i1 }$ ^$ g* rWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
" p6 L4 f7 S" _- T8 Q, U7 U. ?6 `/ C- C4 \+ F4 k
出现问题的原因: T; q7 v5 @/ i6 n, @/ J: a, o: ]( k- \
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
7 I8 G- h6 ?. ?& G! l! V! Z一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
- y( Y4 U& a5 b- n
" H2 @6 |% Y7 ?' @9 ^) K! J解决方法:4 }! C$ T7 _+ w5 i V& H& e* z
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。2 R6 B0 M! Z: a% `" x
( D( Z) e' r7 n8 Y3 |
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
+ F5 o6 O# H, f. M3 N打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
3 ]4 _: M$ r4 \4 r
2 x6 n4 x, D" A" Z. k一、php.ini 修改方法
4 R$ W# ]9 F% n/ h) P+ a$ N把权限作用域由入口文件目录修改为框架根目录/ M: ^3 _" o1 L3 M( h( _
7 h: Q( G e6 m, Q% `# J2 D5 ~
打开 php.ini 搜索 open_basedir,把! U6 Z9 e$ l$ d
, e: M$ |5 p3 E: f6 _) h5 M/ l
7 k% [. d, f+ C$ Z
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
& o) L3 P) K1 d" G6 q: e5 k% R0 {3 ~2 |4 n
修改为6 z! I6 I k! t2 c4 v" P* `" @
6 Q# c: m, }" w* ]
1 F% c/ [% x) u4 F
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"* L' i) H5 D) ^
; l' g1 |" o0 O2 H: |" I' [: _
5 l' L' K. k) {: M, l/ z注意:
4 w% x+ C0 M0 g如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。8 |# L) ^; L: C4 `8 _! j& U8 H$ f
. m/ d4 c% S' r9 @0 o+ A
二、Apache 修改方法
4 g% m! A* ?* x3 w1 n. v9 k$ F* ]/ gApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
2 |4 \3 R8 K% m2 T; d; f" v, X
: D6 H6 E& P" f r6 `7 Qapache4 a2 B* f& k$ b3 z
├─vhost$ C# Y7 a9 i- y, I. |
├─www.thinkphp.cn.conf6 i- |7 T5 [& u* C
├─......
/ w9 K8 i. y& c/ [: \├─httpd.conf
# W8 b2 r1 x$ h% \
* l1 `' `4 F3 b8 g; N5 @ b4 z x! Y* B: S* {# O/ Y: y& H- B( x3 c: o
打开 你的域名.conf 文件 搜索 open_basedir,把! ]" G- Z( F+ @4 Y- ?/ x
4 W6 _4 j# d/ q2 E& p5 S
- g7 i5 q7 R0 x3 Uphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
$ _" p/ L% ~! x0 Z+ _5 `. V7 o+ U* e
修改为
3 G( Y2 O+ M6 N( c/ W5 F. E% O# [& ^" i. C
4 u2 U8 E( g9 W5 w
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
" G( C2 k6 h" B# F* K$ h9 \$ x$ [- k+ v& b. k/ T+ I2 D3 t
* |' \/ T9 i. b3 a# g- Y9 l) F) y
然后重新启动 apache 即可生效
/ k7 p7 _ C A, J> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
7 _- ~' C6 \" c' X* e8 }
* C% o0 T- L1 r* h% k9 x三、Nginx/Tengine 修改方法# }9 ^8 z4 x- q% N, t+ y
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件7 H# D' `" _" ]$ z& S. x" n3 ]
, _4 }( B. L! M% t. ]* {# j
nginx1 }9 H& O) ?# Q5 Y, x$ n! J
├─conf
" v6 H6 r8 [4 l" E7 B _4 K5 O7 o' ~├─vhost: M1 U/ A3 c4 C4 t# e7 M7 k, K
├─www.thinkphp.cn.conf
( G; j3 O0 S4 E9 U0 G├─nginx.conf: a% Y7 A3 j( M, _
├─......4 H% Y* Y! }! k, U; P
├─nginx.conf
; S0 p6 t0 ]2 {; p1 j
+ k& E6 ?! }1 w M# s( E* i1 r; I+ N: O! T# u) i2 j
打开 你的域名.conf 文件 搜索 open_basedir,把
' S- U% K: f5 Q
$ z$ ]- P, }! ^2 O
2 b1 U7 G) w6 K, s" Mfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";* ~' b5 u1 E; p+ V/ k# Z' D j
+ g6 g# H9 t4 K- M6 D修改为
2 S% G* t) y k5 F6 y. w' w J& x
[7 v/ x9 N. I$ [- Y4 n D- {" Dfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";; T" c2 g0 D* C* o
* ?8 Q: L+ E! {+ _4 U0 L: I! y% f' i) [0 h2 c4 ?6 X3 P, ~
然后重新启动 Nginx 即可生效
- B- u5 x) R F5 G4 K7 V域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置$ O4 P2 E+ q# X% F4 q: A3 p
/ f: X. K. f+ |注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
" X" e# o0 [" z$ Ffastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";5 D/ z" O6 I X* H
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;. y* F5 D8 h5 `# I
依然会生成错误的配置如下:
Q1 F! ~- l2 f1 \4 r4 h: ^& @6 |: Q5 U( _
$ a1 s4 f V9 W# F4 J8 ^7 i/ Pfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
% D/ t/ i1 y) L( _. I- S: ?( E+ Y. P
7 e5 W* F0 Y% o o" u! ^; l, C( l
四、fpm/fastcgi user.ini 修改方法# Y4 g5 w' n2 u: Q3 o" ]
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
5 h4 C% J' O d9 u `: S9 v. w- Z2 d5 N
2 q+ L& }- B( M% Y1 X5 u
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/, \/ G6 p* K5 L/ v+ w4 j( w2 K9 J
7 d; q! m9 u7 a: n
修改为
2 B0 Q4 q3 Q1 D) E! j2 {" [
$ ^$ K. x/ w' h2 ?4 d. I
0 A; F* ~3 \4 D7 ^6 _( Jopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/* V& u0 A8 g7 _$ }7 N
8 b* Y5 `. @4 |) {3 e- D3 \* {. F
$ {+ o9 `$ L' \2 b然后重新启动 web 服务器 即可生效!
1 \& [$ ?, ?. Q6 N+ u
. r& O, H& D- T% [/ t, O4 v总结:* @# J# ?, I; \6 k1 m
一定要仔细读此篇文章,否则你会选错适合你的方法。4 N, t6 `3 z3 @. W- `$ H
一定要根据自己的服务器环境来选择你的修改方法。
. y3 |6 z6 }2 p
& J, h% N. ~3 i* a由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
. o* F+ G; J; C/ w1 f+ w
5 J4 _6 J2 e+ L' g2 w# K; D. i8 D4 T/ j- x7 I$ x
+ x5 b0 z7 E* A
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。# M1 A4 ?+ i d
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
6 ?& a. _6 B( u& X3 L1 {1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
' K, w9 R8 c! J# n$ E0 Y2、必须重启PHP;
0 {- C3 B0 | E. L' R) H5 U" C7 C0 F" S- h
3 h/ d8 n, Q+ \4 _3 y
" l9 {: n4 ]; F8 @8 Z% \+ y
. M( Q: G8 ^4 c- N2 B% K7 }
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法# Q; O* {3 K% a! d1 o
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;3 A. l- c* S2 L/ g6 X" c+ g
4 @4 i1 C r: d
我的解决方法其实和文章也差不多,原理都是一样的:
" z9 C6 I( w( V- ?7 j/ i! N, m+ |0 K
我是看到LNMP官方提供的“防跨目录设置”方法,如下:1 Q; F& C: h: H* j- a2 |
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
% M+ ]/ I* c* f) k# M' P( p3 F# |1 q" B' O! D
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。: a m0 t& C) H2 w
4 `/ R* a# ~" f7 D% K$ F4 }
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
. V4 g, L* r5 g' }可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。- o/ J3 g0 I& a1 l) ?5 t8 ~
删除的话rm -f /网站目录/.user.ini 就可以。% N6 t4 u( R. J' R, K; d
修改完成后再执行:chattr +i /网站目录/.user.ini! g2 s P4 D5 N6 E
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
$ z1 c5 a* i+ G2 Y I如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!' n% G& J# m( H8 z
/ q; h5 o2 ]2 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。
! x! j& u1 X9 s
* u! n! V: |: O3 o$ }: |LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。" r' R0 M3 e' Z3 N- A
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
2 N! ?7 w/ U2 r; z' J2 z. E
( P" ^9 f4 W* R/ O, }7 y5 C) Z; M. B N0 ~( w# Z' ` k
; g( p/ S* _) u$ X5 lLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。. H$ y) l! d: h/ L6 h* _
9 U" N$ g$ x" ?" V7 S, y重启apache生效。 |