今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:& E, g' T+ K1 w* |2 ?7 a
5 o$ ]8 ~1 J; K- B! y
6 n4 ~$ X! F% Q+ N4 I" Q' rWarning: 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
& G- F) X. I6 e1 y2 eWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 205 m( O" ^. m: ]$ D3 {4 B
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+ M3 l9 E5 s9 K# u" n- s1 v
& Q; n0 p1 T d8 s# j' U0 S8 l. E7 n" q( g1 Q& P8 N
- }6 K4 v% q W
* O: r' J- d7 w- `: p
% x# ~# j- B% R, K3 e. P或者报如下类似:
8 E i) ], V2 I, G1 _& yWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):6 D) A% h4 R$ b4 z+ t9 h
2 O+ o& r7 v/ _+ W4 w# k
出现问题的原因:
# y# y! H! F4 [% @4 o查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;% G: p' k3 w( M
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!; b, e3 P6 b7 {( R; i" H4 O9 I
% F3 U1 Z7 P$ i" Q) f4 S' J4 S2 R解决方法:3 ~9 _( G0 u# \) V
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。1 p' a; d+ T& B4 X3 z" S
( E' Z4 G r8 ~7 f: i8 M如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?. H# X' i+ o1 ^2 t4 V0 l
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。) n i: x( f* V- o
) j! p8 |" M( P# u; X" R* C/ i' u4 n$ G一、php.ini 修改方法0 {; |( U% z3 g X) E! q* v3 g7 Y
把权限作用域由入口文件目录修改为框架根目录5 ~0 ?2 l/ {" [
! @' S+ [* v. S/ _& D打开 php.ini 搜索 open_basedir,把
0 O$ y2 S. k: d2 `6 N, I% {) x9 x' c! L$ R. O8 |; S7 W" F% Q9 p$ }. e
6 N, X. `. @5 }) Nopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"3 m/ T1 N9 N7 J) ]: L. n& \! h$ d& b
! c% x$ B% N4 @ w
修改为
: _ |2 V% W* x
6 E9 s( v9 ]7 i. ]& z6 k
/ H3 z& Q( o) r" u3 qopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"8 E5 p+ T, N- v1 y- z! u
8 N' Q" o! f* ?5 y' C
/ w- p0 A5 @3 Z D0 U* R: E注意:
: t2 E# {/ C+ z6 V9 O# w% X- S如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
/ W) m3 J6 t, a9 H; M
) }( g7 Y# k, R% z' V) T二、Apache 修改方法; E) i; o# }% t W) h
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
2 p9 l2 u* R, Y# r3 [
1 @; Y' B3 n8 Z6 `& japache" s) E9 p3 O! E9 ^9 w
├─vhost$ E8 @8 j: ]9 E: S
├─www.thinkphp.cn.conf
" T& ]1 n4 G5 }- _, B( P/ B" u├─......
' h N8 u) K5 [0 l$ Q3 H├─httpd.conf
5 p5 N3 t2 P; d) ?" G- ?9 j6 D8 L( R% Y
1 A, L) L! d8 Y9 E/ D打开 你的域名.conf 文件 搜索 open_basedir,把4 a* b5 g R i4 V5 J
5 e. i! F3 d* h* |1 Y1 d1 j: l @- P
. V) j1 m& B% U$ `8 ], {3 ephp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/": P) C; i* D6 v: H- M3 }) A, C
4 l) ~# Z8 E$ h
修改为
; b! ?! U0 B6 U% q7 H a
+ _/ N6 p, T% c+ O4 |* q" }$ H0 I& `1 p
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
* e4 Y% r4 O% B- B$ k' D; M- `5 x; I5 v. o; C! r, |
, \0 r- r4 A8 N$ q9 _0 L. F. m然后重新启动 apache 即可生效
* Y- A( F1 n7 f; N) X. n' z0 G5 {5 y> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置. P2 ?+ g, J9 _4 ^2 z8 ^# _$ X
' N9 a$ q: N: C' H# [6 h6 K三、Nginx/Tengine 修改方法
: _* D0 _( g/ pNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
+ J8 E$ J/ d$ Y p' a* o
: M1 u& J! Q: D! B9 o# Tnginx- O8 J5 e6 j; z" u' n
├─conf+ [. }! w5 U8 ~7 x, B
├─vhost5 J! E, Q: F5 c ]7 K
├─www.thinkphp.cn.conf& f _" K4 Z% u, |% s
├─nginx.conf$ w0 d* r" A) Y A
├─......
) a. D! [. j* r+ s8 W* r4 s├─nginx.conf
8 r2 n, c" O$ R- ^# j4 ?5 c# `
?8 @2 s8 K. C
* z0 y, s$ F+ c! B1 X4 f+ {打开 你的域名.conf 文件 搜索 open_basedir,把! [6 _: F/ u0 J; _9 i% D0 s
' }, }1 |6 Y9 o- f
- P0 B% }" e8 _8 |% o% j+ Rfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";& F. f, B3 e. m. j) R9 d
% S2 f3 d% z5 m5 u/ x
修改为% X7 i2 ~% y' h2 w9 n
# f& V9 C1 s! @0 t( S1 F8 c: ~) R8 n, c _7 P( R* l& V! e
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";, [; }( t4 P# i
. w0 w% w1 {( I5 L/ K/ c
" K5 w1 T9 t9 O+ y
然后重新启动 Nginx 即可生效
# C- C5 P: p- y7 i域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
, \% ?# \0 E' w: v0 u) O5 J
0 p: `( Z2 Y! @! Q/ ~注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):& g" A. G1 A J0 @! C
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";8 H9 ?3 e& }4 P+ w8 R
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
' D& s) \5 L" N) P" m依然会生成错误的配置如下:
( _6 O3 l2 v) `& m) R2 [# J& X
6 t7 F+ B3 x' h: e
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";+ S% q9 j8 N C* C) `0 K3 G$ _
9 U' k4 e# O5 A3 h Q0 m) ?. x5 c
. _7 l0 T, p4 |9 s6 x* V0 r2 S四、fpm/fastcgi user.ini 修改方法7 C! s3 `# I, S
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把- K5 j0 s* p1 ]- d
0 E/ H/ s W9 x% v1 \+ r+ o
3 t) x+ s1 @* e, A0 K+ Bopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
* v; v2 h! X3 H& p7 ?% |$ Y X7 Z- i1 ~( y- w0 y6 v
修改为
* Z; _2 w" ^2 X0 i: W0 u7 ^2 i/ t$ c/ ~
9 o! Q' ]- P. ]+ X: C' `: V5 a
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
, I% r6 ~9 M& J/ }! _( n& V6 ]' }3 N7 V3 C6 q; j) h
7 ` _9 p& y' G: q, v% I2 m然后重新启动 web 服务器 即可生效!
1 A' ?" ~% f9 f( F
d' w- y7 u+ V6 O! c/ f总结:
8 I! C, I2 s- @# u m一定要仔细读此篇文章,否则你会选错适合你的方法。0 j8 e$ T J% a5 d- d
一定要根据自己的服务器环境来选择你的修改方法。
; h" c: x0 O T7 z" j) q. L" D2 H8 x2 s3 O0 V! c. B: N4 [* E$ r& O
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
0 \3 f) ]& X: r5 N& [3 s! k6 g! j6 C. K1 G5 ]. L& w: t
P9 Q' ^6 H4 d
) b) o- c; x! J2 n c& J& Y最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。! K O3 @: S7 C$ |7 }/ m
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
b( d# I) D6 z) v7 u1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!! w$ W+ A2 _; v) X+ y" H" ~
2、必须重启PHP; J0 \! r2 |" w e
- _6 u' J% Y+ M: U: h
& ]' L+ t5 S/ a% v
/ h& l8 h' s* L! K4 ?+ b# |# x: F O. T
# {1 \# i/ \* P+ K* d+ t; M
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
# W( j Q# T3 {5 S我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;0 v8 H$ F& _* X5 U# t T# q( {
' ^; M( D# s, J. {% Z
我的解决方法其实和文章也差不多,原理都是一样的:0 s( A C. i. K$ T1 U
/ |+ x& c( F) N, I" {( ~3 g& i我是看到LNMP官方提供的“防跨目录设置”方法,如下:7 `; o; [1 Y% s
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置' S. F9 |+ N& @' x5 i ^ B
" }. l9 n3 S/ f$ N2 c
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
. i2 \, W/ x0 x: w8 k. ?1 B6 L3 w2 W, c5 \7 p% U: t
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini A3 Y R8 ^. q$ n2 i( H2 \/ f
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
4 O1 W/ e, s3 \" S删除的话rm -f /网站目录/.user.ini 就可以。; d0 @/ _' n- E+ \; [2 z( r4 t
修改完成后再执行:chattr +i /网站目录/.user.ini) s: T& z; a# H$ X
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。. J5 [( U: h" @( C
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!& r' K a @8 I
& H/ j, ~, H6 k; x! G; b
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
2 q- i9 n' ^. t9 A: ?/ `$ L# C4 X* f$ _1 x: R+ T6 l0 x# d; m$ e
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。. p, ~. e, [- p; v1 {0 b
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。 {; j3 F n% q: I% d
) T- N3 Q9 w ]( o! C$ ]' o* h* f
, O. e2 i) _( e& S, v! G j
* ?. N0 I* v3 K* k8 C5 x
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。4 k3 ~3 W- A/ r: ^! Y/ N4 k. W
% o6 b! J( E! d1 p* K0 w0 |重启apache生效。 |