今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:7 V/ v2 \! v' [, r
6 X1 p; \9 t1 J
8 j& V( z J3 J4 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
) }3 [ _; C0 ~Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 206 K6 |2 c- |* j! w! v8 g; R' Z
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$ m7 z w3 x7 C' s \. L* Z9 @2 f1 q
9 A- P; T: f8 Y2 v0 Y* F' _! T" A# R
$ [% ^3 a2 O" V9 i* Y+ O
/ z5 n2 g; g% f4 N6 e4 b
' ~ w u" f! V1 d" r& w+ }2 {( d! }. H
或者报如下类似:
$ j* B/ v2 I/ P- x, a- u+ qWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):4 Q* \/ h7 K2 p0 j1 v' a
) p5 f) Z* {$ g F出现问题的原因:/ J/ ]) {8 z4 T! v: F/ k
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;0 R) W4 E: j) s6 n y" i; r& g- [9 J' ~
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
6 m: L8 Z( F( u* W9 W- _4 m6 j' Q& ^* I
解决方法:
. u+ _% m6 q7 _9 G1 Q0 s/ J" D我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。- o i6 U/ b2 ?" v: w
( O6 Q2 p m# k& U4 M2 O: d如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?) y9 _2 R: i1 X
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。% M( }( Z- Z' v
: A) X3 o' A+ y7 F8 p# f$ v+ ~一、php.ini 修改方法: H% F7 E" q( y1 v; L* J
把权限作用域由入口文件目录修改为框架根目录& ]4 x* l2 S' G* g) B b# S8 I
! h6 F0 L2 l q, L打开 php.ini 搜索 open_basedir,把, ^( A/ Q3 f+ @5 n
( z- ^4 V ~& j1 l4 c3 |% H& k2 r" e- b9 o* G, s1 t, A V
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"' R4 n; n# J( {
) D8 A, n* A. a1 @7 z
修改为
2 G1 K+ I% z X; c
7 H d' D$ K4 K x% v$ X* h3 I, d4 g1 Q8 V+ D, Q' \1 I
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
/ U5 [! D# C& f
6 j4 r/ Z, G2 F [, I& w& w) y4 g, ^) H A+ H9 @/ g! {) U
注意:# v" t0 Z2 X) Z% X, U* ]$ F
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
& }+ ~; Z% M; m: x) l/ x6 l* v- W( d
二、Apache 修改方法
+ b n; O5 s6 H. sApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件 ~7 [2 U( \: E7 Y" U
6 w/ W) S, c @: |- Q+ U8 P" q
apache8 B g( [3 U3 K
├─vhost
, k7 S! _1 K2 W0 W! R& Y' P├─www.thinkphp.cn.conf; i" j G: J% C
├─......
' G3 }# W* V3 |2 N9 [* ?├─httpd.conf# z4 m5 b' e' |5 Q% w
' c% J+ f# M0 [% ~5 Z7 r# \+ |( i( p5 B
打开 你的域名.conf 文件 搜索 open_basedir,把4 C" }1 N' s) V j8 S: y
. s0 Y/ N; d0 v9 w
! g! Q; a; x! `" K4 [, D5 Rphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
' B: d( j3 x& F
2 I2 |* W6 C' ^8 \6 t" x修改为! P: I- Y2 t, @$ n# x4 Q5 p
% H2 u) Q: J7 y/ [. Q, C4 c9 `4 m$ _9 E" ^& v* k
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"; G6 j' ]& I- L5 j
! v+ I; Y( k" L. H) B1 Z7 m
! j" _0 j2 Y& o2 }然后重新启动 apache 即可生效
% K8 g7 t" a+ z% d> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置3 J5 f; w, a4 @- e) {% U+ L
6 B' f$ G' ^( V8 L, M0 o* x三、Nginx/Tengine 修改方法7 d! s( a8 _9 ?7 |( S( |
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
& \3 V) _2 B( V
- x' E* V5 U2 Jnginx: @+ h$ E( p$ F3 |' d' C
├─conf" q# g/ U/ \5 x9 ]5 `
├─vhost
: ^8 B3 G9 n9 A├─www.thinkphp.cn.conf
5 Y' l% Y+ p" R# ^+ s* k7 f+ Z) M├─nginx.conf
+ B$ x+ d5 e: V0 t" U# y M├─......
/ t/ p2 G: \/ n' C├─nginx.conf6 k1 d( F+ G# |2 o V
* Y5 U" g1 \7 D4 v
# }8 r- s) w2 s5 y! _% }8 Q0 W
打开 你的域名.conf 文件 搜索 open_basedir,把
' m- a ^7 t8 ^
* H, ?- N i. P8 `( L) g1 n/ w6 u( O$ W$ l
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
' U) r. @ x& F; l8 q3 W1 Q7 O/ H1 c
修改为' u9 {& {% n$ U
0 A ~' F5 k1 W& G* z: ?1 O" s' H' t$ z
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
# p, n9 V; b! d+ X
6 x$ R. q" _' G& D9 W8 L6 b
6 \/ Y+ m4 l" t/ ]: `. G, x& B然后重新启动 Nginx 即可生效
& ]! K$ |! R: y' I5 ]: ?1 D域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
" }" r: G0 A0 e6 \$ r, m9 {5 J2 B4 x3 n' j& `. Y
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
! e! b1 B9 a3 Q% C% Nfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; V9 K X D" H5 W
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
* k6 r' e8 B5 \; G2 a4 k( C- v6 h依然会生成错误的配置如下:3 }6 l6 [4 k6 e) G+ x1 a
3 J4 m3 O$ q, ]% C" H) q; ~ Z1 d2 C
% a( A( ]. T- tfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
9 W3 B5 {) J6 R; D6 A+ L
6 u$ q% `8 d& g% a8 A% b; `+ s% B# S, x0 q+ |1 z9 g. G( Z8 L
四、fpm/fastcgi user.ini 修改方法
) O3 x# t4 S6 n打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
3 V3 i+ I+ j! G0 @( K, b$ c
/ R9 C& L |9 p- w( ^1 M" y. G7 A D3 q
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/: A) U# |, o0 t
* q* K! X' g5 R) G/ [2 c* h# c
修改为5 b. {; d. ~; X! O& l
/ R4 a ?$ v4 C: J: j
) ~( {& @- ?" J' v [. \
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
$ M# N2 ?8 `4 y) H1 t. q: J9 c1 b8 d! C, o8 e
; Z: ~& U5 H {1 ^7 g. `4 ~
然后重新启动 web 服务器 即可生效!$ s9 O* [: I+ N
{2 i5 M% G& M
总结:5 I! G$ E- i' P* k0 w$ k5 Q9 n
一定要仔细读此篇文章,否则你会选错适合你的方法。4 k! A0 b! \/ t2 p4 h# C
一定要根据自己的服务器环境来选择你的修改方法。
& Q, r: Y6 J( ?2 }% Z1 k3 X
( q8 W' I! ^1 V" U$ e# Z由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!8 t; q( y! s. \2 h' B
0 y# {9 O3 L! \/ ^, M, c
8 V) k: q/ `0 E! y H. C3 a
1 T$ {. C6 S8 t% G! v! Q" r1 j最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
M8 ~8 v( }' S1 p' Q4 |宝塔面板出现“open_basedir restriction in effect. ”的解决方法
) h; J5 ]/ q6 Y' [; q3 s. x* e' n1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!' f( i7 I! { i% P, \# c. ?' F
2、必须重启PHP;( P1 l: Q$ r, d4 j$ ~
6 T, O, c2 W9 z1 D3 n9 l& {% U( s
& ?) Q7 I! a8 Z: b4 D' ^! j
5 Y V1 y1 G0 p/ E: {% y1 aLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法1 C8 H. Q8 l X+ @9 t$ g3 f
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
, V( G2 z* h% x2 L3 k4 t- d) o& Q, V% x+ R
我的解决方法其实和文章也差不多,原理都是一样的:
9 @3 T. P/ E( i9 `
" @5 f6 Z$ {4 L- P4 H我是看到LNMP官方提供的“防跨目录设置”方法,如下:- O* w, d1 l/ q8 e% j
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置8 g: y: y; C6 j: j
' `" S- k& A8 B7 hLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
4 W" b4 y5 O C' Y0 i
* x' @. }3 w1 [% D: f3 U6 z.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
4 d" G6 F3 t7 n8 l( f. s可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。1 @% D/ M$ z% i9 t+ ~; i
删除的话rm -f /网站目录/.user.ini 就可以。
$ F1 T; a- T e9 a7 F' [. H) I; F修改完成后再执行:chattr +i /网站目录/.user.ini1 z% W' L/ g, Y6 ]
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
* t6 e0 H1 M5 j如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!1 h, z( l. R9 l: p0 R
) V9 c7 l Z9 g" E; N+ s2 J# W7 N" l
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
, i) s4 r2 @) [( b. Y5 H
( u7 K" V, W( U5 R% K7 @$ d- nLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
2 ~+ k: \, M" ^& {& C! M在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。: Z, ~1 Y$ ^3 B7 P D
) L8 q+ q5 ?" A: A3 L" S9 ~
: u+ k) Q5 o8 ~
8 ~1 k/ F8 g3 `) y+ H9 D; _ `LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
6 p' M% v" F: x$ `5 I
* R# H4 ?# L/ Y& ?重启apache生效。 |