今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:7 X2 U* F3 ]" c2 D+ |
# V$ b8 W$ K' c/ z4 s; X$ G; {
; s. Y2 a' x" ]0 s: M) J+ V
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# f! P2 Q' G* l$ g
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
: C* U# D$ }4 L* {& S# YFatal 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
' w. V5 K' A/ V
4 ]. o2 J0 q! ^1 x9 F! d# H+ U0 E0 n& Y8 R! _$ M
! l: G3 W6 M3 m. x, w; I
' R% h n' V9 o: F0 M- B
+ g7 {6 m% G' Z; ^1 K% H6 k: t7 K) w或者报如下类似:! v. _1 X! t7 A4 H: t
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
/ `: G7 U0 g d2 U) a4 f# `+ ] U- ~7 E5 w' a2 f0 O2 z, U2 R& ~; ?
出现问题的原因:
" e. _8 j) \' n' e* U( f0 [查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;9 O( d* T( M+ Z6 D3 b$ u- T
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
; o9 I( n z0 Q4 M: y. V7 V4 ^( e& w- L! p' l. y7 R
解决方法:
2 \) h8 _) K# y6 V) L我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。# R' I6 ~- }& L$ @
, |- S' L- \3 e
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?5 h: M' T2 f0 h: |/ q
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。' t3 q9 G1 q& n2 |
2 ~% m$ x' G4 y: P一、php.ini 修改方法 ?1 |% m. X6 b; u1 f. o
把权限作用域由入口文件目录修改为框架根目录8 A5 l' Q$ N( M1 x0 x$ i" Z* U! t
- Y! x, J) L+ n+ N5 d9 Y
打开 php.ini 搜索 open_basedir,把& U5 v4 x) u7 R$ A4 y6 d8 A! y
T8 j3 G- Z1 O* H5 R
$ S1 y$ I1 I8 M$ y7 V9 G0 o% S) J
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
# N" x; o, P. p2 O* }6 \# S' }, s9 u6 g. j' U8 M9 y' E( n( u
修改为) R2 r6 Z% ?& @ O2 O
& B# d& z' C# Q% ~! ~% ^/ Y( {' O- C9 W& G- {' k( `+ z# f+ J3 i. f- F
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"" t" m4 d+ z3 |+ e0 [- K
, P, M+ {# d; k$ y4 A# f7 X |. \
" p$ A2 m; b0 h6 Y% u# X0 u
注意:/ l' H3 L" ~( z% D
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
{" {7 m. @# n& |5 R9 G7 V* w) ^
二、Apache 修改方法, E$ ^/ M! \$ ?* t t1 t
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
0 r7 s# d/ Y+ f4 Z) F* \6 ^" j$ D8 {+ k! i% X# [: o) |& p+ a
apache# b* ~' w8 U& v3 i' s8 e" o% f1 o
├─vhost2 Q/ g$ b$ H6 I; l
├─www.thinkphp.cn.conf+ x3 l' c) {+ _7 ~6 i, G: L
├─......0 j. x' J3 I: l" ^) w1 [3 y! ~
├─httpd.conf
2 j1 l1 j% c8 L% ?
( o5 R+ a, ]4 N
. n& x2 f4 q: l7 r! a5 G打开 你的域名.conf 文件 搜索 open_basedir,把7 T0 V1 D4 }" Q: H/ x+ U4 i7 I
) U8 x! l& L0 _3 i2 M: j1 z+ h' X% G Y) o2 X! l6 o* j E5 X
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
9 S& M. P; z7 a7 o. ?; ]4 o. v* m8 x. r
修改为
/ L' O* I) Y) W) {: X9 e7 {0 `
0 _. p' B V6 Q C" [7 S; ~; x3 k( k6 ], r$ p" u+ l
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"/ ~/ [/ _% q" ]0 T: R, q1 y
4 ]. b% E# Y6 ~2 e6 D y( R8 B$ m
2 `9 _" z. ], i) o* V1 Y* o然后重新启动 apache 即可生效3 k* z1 c& x* W4 d, i- M
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置0 j+ M/ W3 H% Y; ]; f9 T
1 o, [/ e. G3 u! ?
三、Nginx/Tengine 修改方法
% V# {- R8 b4 [% PNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件7 k! t% O. `, O1 ]# A3 p; S
a: }1 b: E" S$ t# r: {- D9 Lnginx
( W2 z+ ^: f. s% ]* ~9 f├─conf
9 }9 V; ^: D7 f: c/ s4 c* Y% k6 x├─vhost
; R) U6 D( N; x# Q├─www.thinkphp.cn.conf' Z) n* P" I& O! a0 B7 R9 q2 X# V1 L! t
├─nginx.conf
5 n% [) p. q. o4 X$ i├─......% D4 j7 t! j, M5 [2 \6 \
├─nginx.conf+ K @, a" J, n! d! Z' b$ P5 i0 `
% c/ x- r! n0 K4 J
; }% G1 m' o* T打开 你的域名.conf 文件 搜索 open_basedir,把2 E& ]6 J) m% N" k9 i& t
% \2 h* F+ t/ F( k
! v# M" l. E; p& e5 C- F2 P3 ifastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";( E5 _ ]8 Y+ Y8 s) O6 F% w
, r6 i+ l" |- b3 V) N. T- Y* c. E; n
修改为- G" `9 Z P6 a5 H
( S- Y# T+ ^( ^ h
9 T/ d7 d% l2 d0 b1 a$ j+ w( efastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
# @ S. U# v) Z6 Z1 F$ A. _/ ?8 D
. i0 a3 k) e# q8 D! H v4 ?. T8 [7 |1 W% G5 ~
然后重新启动 Nginx 即可生效
( z# D' y9 U# R/ s" s( T* m& m域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置: J3 h3 t. v$ _3 [
$ P+ c8 e. g2 b8 {
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):7 f; h2 [$ S5 Z
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
9 l: t/ i2 C: ?# Z0 y4 o; q0 x/ s上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;$ o @$ K0 t! _/ Q b/ E7 t
依然会生成错误的配置如下:: V& K8 i* l2 Q) ~' K7 o& C) T
+ R0 i% V8 ]9 }) K. ~( [; \- l% M9 c5 U% G
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
$ I3 I- Z$ V( g6 X' K7 K; k9 Y- _" U# H" n
' N" J. V k2 |5 R$ S四、fpm/fastcgi user.ini 修改方法9 ~: |1 ~9 Z0 W. Y, {5 V& h
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
5 r; k9 J" E4 U6 E
9 c6 p' T& P" t: |
" s% Z% |6 Q+ N" Q. c8 aopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/' p- ]8 M9 w# Q+ z8 ]5 U3 M
% [' ?/ a- g* d( J: w修改为- j1 N U- F$ Q! O# `, Z
' T2 e1 I3 @" k/ f& r
B* z6 E& G3 F& g I% dopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
! r m1 Y# e" |' k0 a L
% l" v2 c( S5 m. o3 H# t0 }
; _3 Y2 m; ]8 t" m/ ?1 s' N7 U% E然后重新启动 web 服务器 即可生效!
6 n) O0 Q( G5 d$ w0 m- o5 ?& z+ W5 H! d
总结:6 V$ q; l$ q: }6 w0 f2 i
一定要仔细读此篇文章,否则你会选错适合你的方法。0 Q3 R2 Y3 _+ I- D/ K+ m
一定要根据自己的服务器环境来选择你的修改方法。
: q# \/ F0 a& a# L8 O/ T1 p0 U
" P& ?9 J# ^/ s' A' E由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
* G% o7 T' Q8 H3 ^2 S; U4 N" t
6 F9 X) s6 I; m- t, G- L8 ?. B& X- \
) n, F( H0 y. r2 P V) j1 Y! b6 G
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
+ E! G/ I& p) z+ }4 z6 h宝塔面板出现“open_basedir restriction in effect. ”的解决方法
" U( n, j1 a7 u# e6 R# ]* d- T1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
6 M, e4 q4 g0 i* g+ X# d2、必须重启PHP;
o/ X' \& A( u+ X: {2 F7 I& o Y1 D+ d A
; w4 f: G1 E0 M" [6 m k4 @
5 h% Y/ k( M }
- w3 ?9 ^, Z' tLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
; H) u- \3 i* z G) f- v- H6 O5 Q我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;6 t) F7 h: U) E, D
: s; B, }. P( f+ i3 ?/ e& z我的解决方法其实和文章也差不多,原理都是一样的:
" I8 c- u% N( I$ e( t6 s8 a
4 h k, P/ X: W, N, S我是看到LNMP官方提供的“防跨目录设置”方法,如下:
; `3 J2 G) Z& ^+ l% H4 n0 @) GLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置7 K2 \4 m# U# T
* G# f, d: U& TLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
- O5 n% `; H8 a" {5 j7 ^' n! p3 c/ L3 I m2 ^5 a
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
& s& b0 Y& e; f) o# j& E可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。1 i: r9 i J. t/ u
删除的话rm -f /网站目录/.user.ini 就可以。/ u4 k& w6 D; [$ L& T. a, `; L0 k
修改完成后再执行:chattr +i /网站目录/.user.ini( k& m3 z1 T' t. @ q
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。5 K2 {7 x6 i' y: F/ U
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!2 E( { A/ p; E1 O# \$ w
+ Q4 X. \( Q3 G3 e
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。 U% \7 j8 s& R0 [$ @
4 M- C2 \% M; v9 I" g6 gLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
+ b% T6 U1 j$ P; E9 V8 k在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
: r; ]3 {% A' ^ a) B0 i! i( `/ b" s- X4 P! j
# x ~( p) M2 _* }, [- E
+ _! D! }8 e- N% F: _! lLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
5 L6 h0 R3 Y" T/ i; F2 P4 t+ R, G- b% e0 _2 w$ g+ v
重启apache生效。 |