今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
& X% g- u" Q' b/ F
; D# B( {3 u, e; h4 |+ |! U+ K P0 g7 q. r2 N* h6 l) @
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 w) J* A3 @. A5 o+ g6 w4 X/ e
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
( X( H! e4 C" d2 eFatal 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" J. z. Z* S. S3 M
' D- N, @$ X7 C$ [
4 X0 `! c6 P# h8 d- R: p2 G; U# m4 n9 W- E5 c7 V
8 V4 {4 P1 z# G$ ~% ?. ?! ^
; g/ s; I h% ?
或者报如下类似: @$ ~3 f# _1 y! W. t5 x8 o
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
1 V1 l# a3 ?9 m7 c6 ~8 _
) e$ l8 T% n" g出现问题的原因:
- m) }/ M5 ^( D: ?, y% b+ a查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;# [0 U: |" Q) ]$ K& R! }
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
6 F5 q3 C) D |, F T5 N
% j6 @! R( v+ g% l/ |$ Q6 r解决方法:$ j' c v; O3 v( I" a) e
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
: [7 i! H2 N! ]- }' z/ l
: \: L- L9 {8 t! a, s0 W如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?5 R6 o0 u" R8 f9 E) L7 O6 q9 D
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
( Q8 \6 }9 Q2 g5 l0 }/ L K5 e! V# r
# s9 H) ?2 _( h. W4 Z6 v' G一、php.ini 修改方法+ e& s8 I3 M6 C# h$ S2 O
把权限作用域由入口文件目录修改为框架根目录
7 p1 @. b, j- H5 d$ h
: ]' P# h; \ s! T/ s打开 php.ini 搜索 open_basedir,把
7 O- Y0 |* P; }1 o
- c3 y! c5 X" |+ B5 \8 D
# S8 _0 W2 r9 T" g ]+ `1 P' nopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"4 U; H6 h3 v8 |& a
6 s0 ~$ J- |6 ]# F1 w p5 D# D
修改为! Y5 V- f% B" H7 k/ r' {6 W
- W' L! m- [5 K( V
* }, P; D0 l6 X0 l1 e5 @4 O1 i+ n4 ~open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
6 r" }9 `) P o# U
8 a5 @" Z, T0 O9 A/ g; ? Q+ q) E( I: t4 X3 }6 S6 z
注意:: q, r# o# G8 _) k; T8 ^2 M
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
1 `6 |6 g( n' h1 O' f3 b
- V+ q+ l5 I$ `" k二、Apache 修改方法
4 v% |, d$ a/ ?6 x5 C: f- Z |Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件$ K! a: l/ s2 |: T. _: ?5 c; c+ F
0 |) B4 G) R( G. Rapache
! h/ v. E; Q" s3 W( C. p├─vhost
J, b. e9 o6 s* ]8 s├─www.thinkphp.cn.conf! s) p- B) k7 F! w( D9 P
├─......
4 \5 F4 f+ K0 f├─httpd.conf
; ~, k5 C+ Z3 ^4 F2 E, \& ^0 K g0 z* h& y( r l) u5 S8 P+ E
! D8 O" K7 B; g7 ^, U打开 你的域名.conf 文件 搜索 open_basedir,把1 V' g M! K/ W2 R# e/ B
% H; B9 R+ t8 t' v4 e) K0 P
. @5 f! H: ^/ g7 `6 Tphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
) [! P3 B0 { u8 \, [% S5 I* H+ h
修改为
) ]! j3 I7 \, |0 W( w0 n* y( U5 H# z2 x. X) R- M5 ?& `
2 a1 P4 z, [' _3 B3 nphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
8 n" ^& t4 `. k1 Y L: r
, S! n5 v4 T; _
# M% s' ?& I4 _8 j/ c5 @, `" \然后重新启动 apache 即可生效4 T" i; D' f& [+ n
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置: @8 @3 P3 A, p- c& D2 H
6 ~9 U5 f& c' q1 P
三、Nginx/Tengine 修改方法
4 `5 q# H4 Z2 NNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件- F5 ]& ~. h, }/ A! x: i
; D5 w5 ~# h+ u5 ~. n' i) I
nginx
2 c9 L. _/ U( y) x5 V├─conf
2 L. S& D- h9 k├─vhost
. T+ A: e9 ^: O├─www.thinkphp.cn.conf3 |$ f4 s4 D6 j- ?1 d
├─nginx.conf9 H6 {! D# h/ A4 K' ^# j. w
├─......( S: w9 w' E' J# i8 w$ j
├─nginx.conf- `2 n' m/ T$ ?! n
! e7 s3 K v( F: D9 ?6 W, n( ]
8 v# J8 r a n8 O/ Z打开 你的域名.conf 文件 搜索 open_basedir,把
, U w5 m3 J: L$ g
* j, y; L+ p2 Z- R5 ]4 S" C/ a x/ z: G' Q7 t o9 q! S
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";) |2 t7 B" G3 R; K- n# x- P h% d0 z
, M' [: ?* K: A9 S% }$ M修改为
( z) O- M3 `5 i
9 `& |4 _# y1 Y- R- F' L
" l* a' t( H) _( @: I% n' Xfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
' E5 ]4 ~7 ?+ |, q. j
4 p% d& E1 c9 u; o0 C. ^/ T- `/ O
6 P1 u' y- ]0 B) ?9 i" K# h" r) h然后重新启动 Nginx 即可生效$ v1 I0 W. z. @/ q- A: t9 W+ c
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
7 s1 J7 \2 B r c$ x% O- Y) c3 E) \/ I& R$ m
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):* r* x" n; Z8 l& }1 S% {
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
4 _% O: O! P$ n上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;/ T4 ^" W. l: D( c" @/ v% i7 u
依然会生成错误的配置如下:; X( m: K" Z& e6 z- l
0 m. D0 Z7 ]7 B# o: D& `" e, j- J2 U, Z* ?7 \
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
- V# o' I, e( Z. ]; i6 a$ ]" x f& z* q
- Q- n5 U1 W# u4 R
四、fpm/fastcgi user.ini 修改方法3 R6 d u4 W2 r& ?& j. X" J
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把+ S: X+ b4 [; k. u
5 Y2 \7 c% Z7 |. L" a( r2 ?
, Y1 c+ O0 z6 q+ S4 Q- q6 Popen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
P) g, O' L8 A b# I6 S9 \
z2 c: r4 Q4 C7 b6 ~+ q1 C, T修改为
, a1 I3 L; ~0 ?+ }
" v o* y( Q1 d; L- s& `
" U' s+ T" K0 |) dopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
( h8 ~$ ~* V: ]' n/ R* D9 y! c Z" ~/ _9 e9 `
" Y$ u$ a" y1 p( h然后重新启动 web 服务器 即可生效!
5 H! B% l# d$ y! G, d( I- A# j) H) O6 g) a; K. p% G" C
总结:
4 |( K2 h: q# Q$ f5 Z一定要仔细读此篇文章,否则你会选错适合你的方法。
% g7 L$ \- C& l8 u, `& F2 F一定要根据自己的服务器环境来选择你的修改方法。
3 [8 d+ Y; a; Y! J7 }6 ^3 I! P+ w% t
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
G) O8 l. m4 D& Y0 N, F
_+ k$ j/ ^3 x5 t3 n1 g, J% w" a' {" ^1 a) N0 ?
/ @+ w3 A4 k4 D0 p/ |: r% E最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。% J9 B" g# @$ G( s6 z8 ]: a6 a C
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
0 ]5 D: p! |7 z1 W; \' O- l1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!) S, D" _; F3 X7 u
2、必须重启PHP;- Y- |9 z1 J+ @
7 O; n; K8 o( M6 F
1 [5 J' i: Z5 i0 z
+ @! A6 l( h' ^4 f( e
8 i* S P$ I3 w9 ]
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法1 I) N/ `4 Z1 s: ?/ l; k1 E
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
" b9 m, F; x. a- p
3 q. l7 k/ ?% o& f; W2 H我的解决方法其实和文章也差不多,原理都是一样的:. L$ ^3 D" F& ~4 t
/ a1 D* w4 B3 `8 R6 C我是看到LNMP官方提供的“防跨目录设置”方法,如下:3 a% M ]) d" L- p& g8 f" ~6 {. B
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
6 a {4 @/ d; {! f' @
9 Z8 k3 ?+ w( b: M* z3 h( A: PLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。) {, {- P+ g; R* Z* ^& S2 v
9 h5 D3 W8 l2 _% z4 `' T4 `
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
+ {' |: N: G8 H2 P) t# y4 d; b可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。" ]$ v* P1 s3 S$ p) W' J
删除的话rm -f /网站目录/.user.ini 就可以。
% o% G' A+ @3 o' j" T$ O修改完成后再执行:chattr +i /网站目录/.user.ini4 U* D/ j5 J! ^' T; C. m, Y6 \# S
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。! P- t y; V$ b7 z
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!( c9 s% G' K8 A, u! V, w
: w+ t6 G& o1 U2 z* A6 I7 Q
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
: p) R' @8 E. ~: r3 h+ }3 N, z1 Q6 |/ f. o/ k4 k% A4 F/ D) @
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。7 n. J& |# ~/ {3 H+ [
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。: k; L& {0 D1 r( ?6 e6 ]9 e8 v+ m
) [+ c, Y8 C( ? [
' ^5 n/ F% s4 h+ M% p
$ ]* Q2 U0 y! `9 PLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
; ?9 F! ?1 e* @, q
, g2 N' i# ?2 f+ p+ N重启apache生效。 |