今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
, ^- Y1 S: h3 M7 d; K! u% k, l. f/ y9 F0 ?9 V. u# ^
. s2 I3 z/ }+ h0 _! ?# d1 e. x: ?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 F0 |/ Y1 m9 F, F- |1 a( o" u
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
; G$ E: t: K, O# xFatal 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 204 U- G8 \: V3 F& R; M; `
; P$ Z; L" {$ v% x# H( X+ w. |
) w' N2 r1 o+ h/ K7 F
7 \# d V6 |' b
- V; r% X: ^: i: E& H0 f. {1 c8 C& K( J' |9 s4 U
或者报如下类似:
" T" m: n4 r: a, h3 NWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
$ U, D/ [3 K9 B+ d; J3 y) S' R; A' l5 y2 P4 \: {" ^4 i
出现问题的原因:) w4 }! n) p+ C* z. `3 M% H6 |/ f1 ~
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
9 o3 r9 a/ a5 [% c- Q2 F& q一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
$ c( K6 w! l) ?) W9 C7 ~: H5 L5 S0 h% T0 a# M: r2 l
解决方法:0 b# B7 N' e5 B# i
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
/ b; \0 G- _9 q+ B
k) t" X1 @0 l: j) n, e2 P如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
# s6 Q9 X/ T; @, a- g打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
' O* f8 n# ~5 o1 K5 k# e" j `: g7 f7 M
一、php.ini 修改方法
3 l$ Y2 l4 W2 S4 k2 {" z把权限作用域由入口文件目录修改为框架根目录
4 { y& [, @9 v) v) Q2 C/ N* M! m; b4 o) S. w0 Q
打开 php.ini 搜索 open_basedir,把
0 S6 Q* q1 O: ?) l; k! `4 z. m$ C6 p# Y0 d; d
9 `7 t1 X1 \4 K9 b# }+ }open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"( |! w5 T/ v; X9 k4 F) Q; M6 H
) X; a4 m$ c9 f$ }% R* u
修改为& W# a) q+ B( i6 \- n: ^) ~. q; e
! C3 S; V* b0 b4 Y( X. ^2 m
: [$ |0 ~' j6 Q( k$ p; Dopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/" W, j0 X5 z: l7 i- j8 \9 Q
" i. K. R) E5 X! r9 w
# B2 T7 i* N1 N
注意:
7 X5 L5 A" V7 P( N7 S如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。0 a4 I0 L9 ~0 P! k8 N5 X
! @8 L# A2 v. _5 _% ]4 F- ?* Z0 y
二、Apache 修改方法
+ E1 N$ c! s2 ?Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件; p! n" B0 J% W, q, a8 S0 M2 p
/ G( i9 M6 F5 Y3 }/ {6 G$ s
apache7 r0 P. B" K& I7 |% ?3 p4 m& B5 O+ a
├─vhost2 K1 l/ D$ _6 s# t1 P
├─www.thinkphp.cn.conf
0 N& L; s1 [; [9 E1 r9 N' d├─......
3 o7 j8 i* M3 ?6 o5 j/ M% g% d├─httpd.conf! K o' H4 y" Z# U0 |- `2 r
+ n) j/ h+ T- B
5 m3 G3 ]( k3 l打开 你的域名.conf 文件 搜索 open_basedir,把7 X* o3 I0 o& p6 h( x# Y+ ~- ]& l
! B7 f0 w/ H7 s7 ?8 {3 T7 T& k
3 E; f7 y1 W: v
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/", [5 t t! g a! [
/ Y+ P& ^ p9 F2 _$ p7 `
修改为
: J7 S) v8 v2 n( g! L& P
3 b5 f- g" J: Y) \4 z( n; k8 F# M* u/ v: y7 V/ U; x9 W0 ~- |
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"3 i \; b1 }* c/ H
' y( a$ v6 Z% O% ]
( p( @9 C) \9 k3 o然后重新启动 apache 即可生效
4 V/ C) L* `/ [& K) g4 o& Z, ?+ ~> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置& }5 m- L" ^# }" R% g: O8 ~
9 ^6 x8 Y9 V, G1 ^, x$ Q; m三、Nginx/Tengine 修改方法# _$ L/ Y! N7 D% ~
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
4 `& M' U: ?( Y: q: Q, @$ k
/ J+ Y; b9 ?4 ^; K2 @: Lnginx
8 u) J( k- E! v! _├─conf' p* T. }( S2 E/ g
├─vhost- C' e! Q( ~7 ~3 }
├─www.thinkphp.cn.conf% ]# r, V% \' z3 k- j, F
├─nginx.conf7 \# A& m: T! j' F
├─......4 Y7 I; \0 d/ q3 |0 m% @8 h
├─nginx.conf
, R% n2 {8 @4 \6 C3 t$ y; r% f2 U0 h4 |$ ~" {
; q- n- i9 s/ u `
打开 你的域名.conf 文件 搜索 open_basedir,把
1 y" I" ~% h( y2 |1 i. _8 T8 T
, q' g$ d: ^, hfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
% }/ K5 ?- b* {$ ^' z
x( z }# O6 Z/ t" H修改为
9 c9 _2 A. A. X$ k9 y5 B* L1 S6 [ H+ c
2 H2 F* f, d+ g6 C/ O% \0 W4 e" G5 a7 `fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";, }% t: ^- [, i! C
; E/ n) k* m" A
p+ x8 [( C6 u3 B然后重新启动 Nginx 即可生效/ T* L) X' o. c/ T" O. C- m) j3 S
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置 {$ V/ L4 o( c+ S1 q
4 C! E- K$ j- r8 a; Z0 h
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
) u4 S5 k# c6 T& zfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
/ c& |7 e; Q9 S" ], n8 T上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;% s; ^6 n9 Y8 G0 p" w% U
依然会生成错误的配置如下:4 H) y! g9 a! y7 C; R
; c$ Q- B, g2 J9 [- i/ f+ ?
/ R9 P: u- ~" k
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
2 N$ O8 s$ }. j. V% R: p, W
8 T5 l! n, a: a% x
" {# h0 g7 _) S- U+ S1 x* a四、fpm/fastcgi user.ini 修改方法- }8 M' M& f4 I3 s. j5 v. N
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把5 ~% @9 w Q q% V6 h0 k( w
) G" B6 ^- E8 E- y
+ @9 _* Q( [, G7 _
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
' |! p2 b. ^: }1 s0 n# F" I
: W8 h( t0 `5 B1 k修改为% J1 g0 x+ Q. V' q
/ _2 R! n5 y! m2 S: p
3 l0 |9 x5 D9 w. [8 aopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
. L4 `: n; s5 `5 `$ F
% P8 o3 ` h& Z- Q4 M* G/ v( G) |7 Z5 H
然后重新启动 web 服务器 即可生效!
7 u9 a, J" k, f1 e3 h0 L1 \( B; e% R6 z" D
总结:. E4 w4 C% B8 E) _5 D: f
一定要仔细读此篇文章,否则你会选错适合你的方法。- b8 Z! {+ Y) v! J7 j+ k g
一定要根据自己的服务器环境来选择你的修改方法。
2 Q4 Y- ^, T1 O
$ ~9 [/ J& @5 K* ^1 o. b7 q由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!! D0 `9 f5 N* A+ A9 Y
; b- ?& g6 W+ Q, ?+ l) z+ U# B% p! {1 m8 M" E, o+ c* t: P* q
' t) |- ?, C T8 V* O. M
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
3 k; ~ j9 r9 S k& T8 T! J/ L! Y宝塔面板出现“open_basedir restriction in effect. ”的解决方法) p9 a, k' E( S* g
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
$ v+ M* p% A$ @ W( n5 z- G1 U* T2、必须重启PHP;2 E+ O0 F2 W; k, ?( K. m/ E
: c9 v+ a) |7 b4 k- k9 c r$ [8 _+ l4 @& |' R9 a
" w4 a; r# l2 ?' [& }$ E- d$ Y' C& N% R* D' ?. M9 J
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法+ K' [) @* w1 R1 k+ ~
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
! H! u' }8 |0 v- Z
2 L* y" i6 t% }$ ~2 e1 J& e我的解决方法其实和文章也差不多,原理都是一样的:
6 X) B8 i3 Q |9 _) d5 G) e2 R# b2 W% H" i0 ?, v
我是看到LNMP官方提供的“防跨目录设置”方法,如下:9 b( m, j8 l! [. m) e( o
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
M( [5 M- l# d& e3 h: j6 p) w' _9 {6 F: n
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。- L/ L% S2 i& T0 ]: ^: l/ S' x
# E2 y- d2 a$ ~) E& B1 c y.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
- G5 M8 E; Y9 s0 l可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
* I/ G. h- G! f% N/ J% A! C删除的话rm -f /网站目录/.user.ini 就可以。
' r$ X7 x! M9 S# |0 j8 y修改完成后再执行:chattr +i /网站目录/.user.ini
K$ r9 v! ~: g0 _& n! _' T3 K$ b.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。3 L" H( l1 o3 Z# b. S$ Y0 Q
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
x* U7 [! H+ S: Q$ P, v
! g: k5 e7 m! V; T" X q) O- v- a3 SLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。9 r4 I& Z; y' y- m" r
) d/ y5 e9 R( n% nLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。) D8 m ^3 K' `
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。) H" s5 z1 M7 Y+ |
. h* m1 ~+ _$ i- W; }
3 ?" v* h/ j2 ~: d) B. M' Z$ Q
4 ^/ g1 K; o# tLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。; P* w! O! S5 ] f" ^
3 p3 g, Y: ^; B$ g. J
重启apache生效。 |