今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:+ ?$ v" u+ T7 K+ z
* K- F5 w' v% E# W" m
) N) w% e/ z9 Z oWarning: 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
" P. X2 p4 Y& Y" L3 @5 v: BWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
# N7 a3 N0 e( j1 e6 {+ ~7 |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
; [2 Y3 a U1 N* X4 H6 T* _& W9 _; D: d
# T- n5 {4 F Z3 \5 x8 }/ J
, @. W- [. K$ r1 ?; [6 u& M* o
, C& `3 l0 K) W! W: W" Z5 o7 ^ S8 c A- N
或者报如下类似:1 `, m: a7 Z+ K2 z( S8 }+ Q. ]
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
" R3 T* C. v {6 z
3 G o) e6 z/ U) y# i出现问题的原因:
5 z1 i4 Y0 V* Z6 Q" {查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;* f0 W' v6 @( s5 g4 Q# h% B7 ~6 F
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
! Q% k, j" \. }: ]
# d' m) m, @& h4 i$ S' u( J解决方法:
5 t1 S o: o+ \5 N% J我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
9 F+ p: u& f' L* _" ?
2 e& n( o8 u' |$ N4 @& b+ e如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?5 e2 Z' K6 _& |2 |) V1 c* L
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。* }: {3 X% F5 s
. `$ ]1 j* y+ [, O
一、php.ini 修改方法
2 k+ ]& y: ?/ ?: o a# B把权限作用域由入口文件目录修改为框架根目录
* Q& @$ D7 G$ p( q# H1 U+ f, |" O' Y7 M: g+ {2 g7 I4 Y
打开 php.ini 搜索 open_basedir,把
9 B8 D/ v9 v5 w
, X+ O" ]1 F' @, S- t6 [- k0 a
; p1 J; P$ X+ x: Bopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"" l1 E: a6 _6 o, |+ W- w: ~) h! `/ \
. v/ t2 k/ O g H% u K修改为
; S# b: N$ r% h2 B! O
" a$ z6 d3 Y4 _5 F _6 o$ j8 @# b8 x3 H% P1 E. i5 Q
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
9 p1 r, s4 u3 N" `2 I( ]) w& H7 \) g/ \- `
" z* l- A) E8 {( t, W3 I& A. o, n
注意:
2 T: _. c1 t' S. L( _( j如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
( t# z. ^9 {6 j0 C! A1 T1 K( a- T+ N" E. [3 p
二、Apache 修改方法; w6 q% R, |1 p$ E
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件) x( p9 [4 Q# I& N) W! B
: o: J$ n$ I2 n; @apache! J2 r6 V2 Y Z9 S7 E4 ]
├─vhost
5 X) B( f) H, G9 N3 c├─www.thinkphp.cn.conf
- a" V' Y5 S5 X├─......
4 L$ a9 a, v/ v! ^* n, s├─httpd.conf& m1 H! h5 c2 [; V
. |, R2 j7 [9 R `3 K7 I( u
7 s# q( ~' {4 @* e
打开 你的域名.conf 文件 搜索 open_basedir,把) \7 g c# H* Z3 U4 I! c/ t
, L5 J1 K# @, V. C6 m. [4 J
5 ?& D9 o' @3 V" G; B; fphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
7 b+ Y+ I- s0 {) G0 z6 g( ]; K1 t$ m' F
修改为- g8 P5 A% r5 g5 c, f: I" h
% y- F) Z/ R9 y4 f M i4 u
6 U# C" x' H2 W8 q" J/ Y
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
* T) J# z2 V) ?5 D& w8 \
4 g# A: w' j; D4 W8 J( F! i" ~" L3 s1 k
然后重新启动 apache 即可生效
# B4 X( F. }8 E0 N> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置6 E2 Q" [% x3 p) M6 p* C8 Y. N
( f( ^ ]8 \/ m5 e' w. d三、Nginx/Tengine 修改方法
; N$ g# R% @& m* w" YNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
% L9 \$ t% y& s
. N: q; R, A! k9 J, \nginx
1 V2 @9 `! p9 _1 i: B├─conf
* Q9 B. P8 t0 U├─vhost
E r: h1 U! c. w" t* G# Y├─www.thinkphp.cn.conf
% I) n% D" d8 J' I. V# q& y├─nginx.conf
W4 W6 W1 k$ f7 i├─......% [7 B# M: T% Y
├─nginx.conf
9 _+ a! l' p+ u3 `4 K! d$ V1 r( _3 {) Y: p$ t _
0 Q4 | @* R1 x" L- A$ g打开 你的域名.conf 文件 搜索 open_basedir,把6 I: a2 C9 M, f) A9 ~% O' [
- h- z* k7 Y" g# ?7 g5 p9 L* S p/ k4 I1 s6 f
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
% Z+ }$ @/ ~/ j8 @0 S" P) [ S I+ R2 E8 Z N" Z9 |
修改为
5 p6 P1 k x% K: u
/ G% K5 [* S9 A/ [: Q* X% }: K
( e7 b! x& c# i! c: P& a+ t0 bfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";/ O- f1 M5 [/ z6 P2 T6 }7 b6 j
7 j: D4 @ N/ G1 Y- R/ V: M6 } F4 D/ t
& w1 a% `7 Q. b1 [' K' n
然后重新启动 Nginx 即可生效$ f% Z s5 }& A4 |+ w. p
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
6 f$ v/ L& k- X: T& P) T
4 S7 J# p% l& |7 g注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
) y% O* N" A5 q5 l2 V5 h4 }fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
7 q( C% a1 s& R+ i* J上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
* O+ t3 @+ n9 G. G2 s5 n& H# R依然会生成错误的配置如下:
. f: p K" _ m) D( h. k1 w1 @3 }, x( a
& R' K F+ Q, [7 e- T2 @* e/ E- m
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";3 C, y. C, b4 v/ Y$ s3 L/ ~
; a f6 w" \3 R e* v
% _3 S+ {; l! C* y
四、fpm/fastcgi user.ini 修改方法) Y, N8 M7 u+ Q" ]
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把- O$ F" d9 {" k o6 f% C' `3 V
9 J% _3 `( z* x6 r
8 k' L2 b3 j. h2 qopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/) H: p4 p, A8 q
2 V$ ^& Y6 m2 F/ V- ^ v修改为: Z$ l3 P1 g: K: M
9 j) h8 S. X7 K) m; W" n
1 V9 p/ }6 d! C6 Ropen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/8 g* J/ b6 e3 E8 Y! i p
/ }! S4 v8 R* @% j, M
, W9 j( A6 S% m
然后重新启动 web 服务器 即可生效!
( g7 W; [& r- n8 q! k: G$ L- W
1 s9 m# v$ r! |; ?1 n+ I总结:& {2 e9 d! T: K. z# T+ Q. u8 z' D }
一定要仔细读此篇文章,否则你会选错适合你的方法。
3 r# l( o$ M( G6 y, k9 d: G* I一定要根据自己的服务器环境来选择你的修改方法。
1 C8 ~( z+ Z3 I( i* S; g, E f' C: D
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!# Q# m* _9 U8 w9 S0 [3 N6 a. j4 H
- [! E& x2 }0 \" u* z9 A+ o
8 g0 T- `! w9 D- A# A6 }3 p
) {' r7 W4 y& h$ a最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。9 |8 |0 R( m, c0 b/ F+ c
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
/ r$ s: K" R& A' U: C: ^0 F" P; Q1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
4 G" C7 I8 X# [/ v4 \4 j" M2、必须重启PHP;3 y9 e' C. G5 _2 Z5 H, s" I4 J# r+ }
5 {$ n/ f: v: C; l5 K$ F& z
% k: e& ^. ^0 n! z/ b0 l8 c8 Z8 L
" s' m+ |# {( T: k/ qLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法$ E" ^9 i/ x/ F% N
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
$ T+ u) i& }" g9 _% V. M# s2 y" `# {1 `% m! q$ y
我的解决方法其实和文章也差不多,原理都是一样的:
! Z( c" Z- L0 L5 ]; ^/ Q( V, |: J5 w8 O W
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
9 w" R7 a+ E- i0 z) y, vLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置+ @* b6 k: w& I( i7 `
* Y3 X, I4 p9 y2 M0 j" x9 u
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
5 ~0 |& ~1 j/ w& f" k, y8 U5 |. j, T) d1 ~
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
( l e: Z, h+ ~& ?. h; e可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。7 A, v% I7 q8 l
删除的话rm -f /网站目录/.user.ini 就可以。
+ `& [% y0 O- A! b6 L0 w4 o% G修改完成后再执行:chattr +i /网站目录/.user.ini8 |4 v, |0 c+ n
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
+ X4 _" T* j$ v! Z" J+ H如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!. T" n( @0 q5 Q- a' r
8 \ j. h, T- I& I3 b tLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。$ t2 h- f1 A* Q) J+ _3 l
( }+ Z3 b4 r. F0 q, \" {8 _! B( Z5 |LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。& V8 Z6 K+ t" w1 o
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。& r# p* i4 `) L( E1 |6 Z" p
; ^& ], |, \- r
) H: @9 M/ M8 f6 G7 t: Z6 z) d5 \# K3 H( {: ~7 t0 q- @) y& }
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
/ V4 W3 F U" J. ]+ f v7 R4 X0 p0 F/ R; \$ j% h' c% {* o9 J
重启apache生效。 |