今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:& @( L2 g, A5 l. m
+ c0 p3 T* W& g ^/ ^) ]1 `5 B* F( w* i1 s1 M
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 208 z/ ~; R& X* i3 x8 w0 Q( j
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 w3 C R3 k9 k# s0 j: l3 K+ `, t
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
6 O1 }$ G) P8 N. @. }5 i& l1 |, m' u
1 c$ ~0 s- V( t7 S- H/ j9 W0 D+ y) F5 ~) y. p/ M- ]
5 }) J* q' b2 c8 a
; X$ \; R; X$ N7 X& x: W或者报如下类似:
. r* p# j9 r( M9 J' H4 L" g- J. f3 o/ fWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
" S A* z* B. h$ D' c b% K* m
; P! X8 F7 D! ~0 C出现问题的原因:' y( t- e: @5 }7 t3 o
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;" v' R# x7 \5 [) ^) f
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
( @4 M1 F' M. ]& h. j3 Q6 Z) n7 O6 {: s f+ G0 `
解决方法:
: S4 m* g8 I$ n0 _ V1 z我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
0 @% S1 B" {& X' ?6 b6 h+ D$ c+ Y! H, O& ?: |$ n, c/ {) Q
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
, f5 y/ L" ]4 A( B打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。$ q# S! t7 g5 f) j& }2 T5 P+ R/ P7 X) V
% `: w* |) Z% E! e
一、php.ini 修改方法
, c3 T" o" G: }) A0 o, M把权限作用域由入口文件目录修改为框架根目录
! m+ {. a M( U" v& n& `# D* X# F; s5 b
打开 php.ini 搜索 open_basedir,把
! b" y- d$ {' n7 W* `7 G" Z
4 b7 P4 T) h( U' j$ l/ z
8 A, b* z" P6 n! Iopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"' w6 \" a" ~: q% n* \7 @
% y7 ]: J. y& I! r
修改为
6 M, R7 m" H* t7 _0 z
, B' _6 j% ?/ U \, O( u' |4 b9 o) A. j0 S. g+ t
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/" F# [7 c' e5 \* i6 z& V
9 s4 p ~% X0 D
x# D4 P& _6 ~3 S5 v1 [注意:
1 @5 H2 l' i8 F! b如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。* h4 ]7 s) R" Y8 s! C4 a( Z3 Y$ L
9 X+ T2 g, g" z二、Apache 修改方法
3 v5 k- a2 z7 S: t. d- gApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
; T. b& R1 T/ ^1 O7 H
: Q4 H1 t3 Q; o% P- _1 S" {0 }apache& V4 V% Q' S6 @4 K
├─vhost
# d6 ~, h; ]; L* Z8 C├─www.thinkphp.cn.conf
/ z2 F' w: R' ?2 \" ~) M├─......
8 B* I4 j3 }; t; j! \; r% w' p├─httpd.conf
0 l# Z* d9 c# \1 @+ z
3 O; r ]4 A: M/ i% P/ J2 _2 p
& s5 q0 u! v% n$ d- R打开 你的域名.conf 文件 搜索 open_basedir,把: ]% l6 g$ A6 @
3 j& W" `+ h+ l- X- |. b5 Y7 ~5 C7 j, K/ b% F. V
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
9 c/ u1 a6 e& p; S4 R4 Z" ^4 k& _2 v! Y" ?! ?( [& m5 Q/ e
修改为
5 U1 c2 a7 z Y8 i8 j: i! r
! ~0 ? y; i9 I+ V/ p* t0 T; S" ~: Z* k$ h
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"2 C0 }# f+ C# u: V3 m
9 a$ t5 u9 y+ r) H3 {; ?+ j0 @7 b; a+ v: X+ F* I
然后重新启动 apache 即可生效! u, L! i* g7 ~; U c
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置- [* @2 R' @' Y1 X! V1 W& z R
5 o- E! ?; }1 w6 x9 l1 e7 z4 |6 b X
三、Nginx/Tengine 修改方法
+ }' y) D& k) HNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
# X7 Y9 {" Q5 r8 v( }% a5 z9 R0 Q( R
nginx' p; q/ N9 Z; ^$ ~$ u' t
├─conf C& P8 i& `$ e" L- T5 c
├─vhost
2 @" d- B7 k: ^" u8 {) B├─www.thinkphp.cn.conf3 ?4 j% S3 D% u( c5 l* }. v
├─nginx.conf4 s) A' V% a2 ^ j
├─......* \; h9 A. k) A& e
├─nginx.conf
6 i7 l. O; Q* M- R, U1 E# d2 t0 _' N& l+ `9 m! t
, l9 w) _) }3 ~8 q7 R2 ~0 I1 G
打开 你的域名.conf 文件 搜索 open_basedir,把
* [& u; A6 e' F
0 \! n7 b/ u: F9 t9 ]2 u% e; }3 [% E8 U( {$ d
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";. ^5 |7 T! |2 W0 i
4 e1 X, o- Y: e0 t0 C9 |- [7 @修改为! b6 H( a' D+ p. c
2 p# j6 K* A1 Z
) i! _9 h8 t' x' ~; x
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";4 C! U9 ?9 c8 b; s) d7 Q
& `! e5 G) Q0 H. k0 L0 B, f `& d3 Q4 T0 Y x* w
然后重新启动 Nginx 即可生效3 Q J6 B1 F2 M1 N
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置, @2 q7 n+ e. u, ^0 b/ R+ y
/ l0 s. [5 \0 f" s6 R
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):* H2 o' j3 C, y; h6 E, K! U
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; F) c9 w; u: ?: G+ G* ?, _
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;, O8 t& Y" u6 V/ ^# p4 W; l
依然会生成错误的配置如下: y0 s' i9 R* G1 D0 \' T
6 v& E& }$ x9 P2 }# r7 U2 z3 v
0 R; {5 {! _, v/ r9 e. |$ @
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";9 @2 t' I7 } I7 C+ M, A7 z. B# ^
0 b( e$ \5 q6 X8 D/ p0 ~5 i
0 c. W- E/ @7 H! ]+ T* M, G四、fpm/fastcgi user.ini 修改方法4 Q# p: x- Z$ x* y) ?7 N/ M# N
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把( E6 f' W4 K9 d. G/ x% m! |4 G
9 W+ |+ k9 g. w9 D6 x! ~1 a4 F: ?! u
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/* s- `5 V K9 C# F r
5 n; L3 C5 u% O8 j! ?修改为5 ]* |; e5 M q
( K& x! F3 q; D" Q
# @9 L: [- W- q
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
; H2 Y$ y% M% T) C- {2 I3 b1 M2 E8 x3 N3 Q
+ C% K, a! s/ F& K* K9 F4 x( m. b然后重新启动 web 服务器 即可生效!( W7 p3 f( ?1 F( F# C4 N
6 f5 W& w: d) f) Z- x
总结:
0 |) T( Q7 u6 N1 f一定要仔细读此篇文章,否则你会选错适合你的方法。
# b/ w* G6 L$ w$ O3 B. Z一定要根据自己的服务器环境来选择你的修改方法。
7 }- ]& u# e# Z1 o! s8 e
( x! r0 ~1 i. @& M6 s由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!9 N' i( ~* ~1 a
& G% O2 |4 S/ T: Z, j
W4 g' h% j) a0 v4 Z! r, ?# X
2 e0 m, c w2 R% f! e最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
$ u. M5 l, C! \: \宝塔面板出现“open_basedir restriction in effect. ”的解决方法
* _' Z# i! F- r. N0 T4 U1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
: f( c# j$ f% Y' L! j2、必须重启PHP;% D8 v- K+ z5 m5 z4 h
) {: R" ^% J& A1 m( z* ]2 G$ I/ G! j5 m
6 p5 P- w+ Q; O/ g" A f4 V2 B1 }- Z5 H; O% f# b* l' g
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法 X9 U" v$ y8 J$ R3 M' d" U
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
+ |. x; [% x# k2 L) j' ~0 e9 H
! {$ |# h- M, ]- k/ |0 [我的解决方法其实和文章也差不多,原理都是一样的:
6 Z/ r( E" G) O2 C6 V+ [5 {
& H* M8 U% u( ?! s我是看到LNMP官方提供的“防跨目录设置”方法,如下:$ k, q1 b; B) C. _6 Z
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
; l X8 r9 O$ W, p& a( T+ A) G' `% Y
3 l7 Q& l* s) g3 s p. tLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。# e+ K- X+ Z( `/ v! z6 ]: A6 d& w
% p9 o1 y) D% z \+ ^3 |: u. G.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini% V! q4 ]8 F6 r$ N# ~
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
- i1 [+ x* x& d" a( P. t/ y删除的话rm -f /网站目录/.user.ini 就可以。
/ |" `( [/ l& s/ H3 t; W: v$ S修改完成后再执行:chattr +i /网站目录/.user.ini
& X1 m: T) s2 N, E4 i' D! w# v9 e B.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。( h* U' F% v4 H1 v- A
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
- ?" {# w0 A/ h, S9 ]9 i* d* U4 c6 J) s! b
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
/ O2 x: {0 w, S6 q @* A
8 f. h" ^* m7 h5 x% sLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。/ F& b. m3 r. m$ ^% F4 g/ z( Y( b
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。: x) I- g, M3 Q( a8 e# H5 D. ?
* h1 X- U4 P4 C8 r2 t' ?
* p8 e) B' A" c2 j8 d5 n: u! T2 P9 D, c7 c6 Y& [$ H2 x6 g
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
1 d+ m9 Z! E7 i, ~) F
, P1 J, K' @+ n1 G4 J) V重启apache生效。 |