今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:" Z7 }! S9 X, W, r: \' j6 ~
p, o7 T, P5 w* k$ f) l7 a7 @
- _# T! c9 c7 nWarning: 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
1 S* `6 v; Y( m. V4 S' x$ ?Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 209 z' t- B5 U' g2 }0 ?. x4 {; F
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 204 @+ Q- {/ ]% H- Z9 F( F, n) B
; ^) ]. {# I: Y" I. ^: w
; [0 }) I9 j+ c7 M7 G! F) y
/ Z; J, N( [6 P, h
2 t F% @; x: c% _* p; j
. \3 i C( }; e# b: I1 f或者报如下类似:
4 w; ?1 s. k) DWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):5 K! ^& E& }: |2 Q: x: b
- G6 ~- G; i8 O& E& M出现问题的原因:# S2 i3 J9 |2 S( g
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
6 V0 W0 G( N8 O: d一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
6 q+ c5 O# z% _6 E# {7 \& G# L1 |3 F0 ~: \: U
解决方法:
; i2 c7 O9 R% v! A/ x6 _% \6 X5 \我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
' W5 _- @7 {$ Y. K
5 Q( a4 Y8 B- V7 R+ r" z* S5 B如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
! g5 ?, Q9 T$ l. H2 |/ I- L) [打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。1 j0 H, C+ J0 k4 A
" r' B1 [- @5 E/ |一、php.ini 修改方法
* y. Y0 K# P0 _4 G% y9 }. w把权限作用域由入口文件目录修改为框架根目录
- C# ^ t" O' K( J& T
" x V/ @8 f/ R' `& ~; ]' M打开 php.ini 搜索 open_basedir,把
. r! y7 J$ `) M+ H) z8 ^* R/ }: P! ?/ v7 | ~* q
+ `) H0 {% z! W( x
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
) S& a/ a/ w2 M2 j2 \4 \) s4 U1 n* T
修改为
* Q- p- H: W/ ^3 z0 @" K$ m# y& z. T u) h' }$ q( j4 C5 Z
) h" u: v; F+ Vopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
; _+ b* w) ^, S* q* Z, x1 g0 H0 Q; F0 Y9 t- W" {
|) v2 E/ W$ j$ l) [( B+ l
注意:
7 a4 N& G. n- f如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
. L H) ~4 W8 f) T# p2 ]6 M
$ _3 O1 C v9 S! K' _& {二、Apache 修改方法 X# F* }& X1 b. U) |) |8 A4 x8 Z& Z2 S
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
* z0 N/ Y% c1 v$ V z: B
5 T! H: L" b) d# H8 t5 @. vapache
9 p/ ^7 ]0 y% r1 R├─vhost
# }3 `$ L) V- J1 r* i) I8 | h/ F├─www.thinkphp.cn.conf! M5 ], l+ ^3 A$ [& C
├─......) O9 k& \7 H. n: ~0 ]
├─httpd.conf
5 s$ j) x/ g- {9 e
1 H: n$ C. ~) B4 v8 C
& u) Q: n' k) T' P4 {打开 你的域名.conf 文件 搜索 open_basedir,把1 Z3 \8 t& r F! @
, q* e) B" @0 ?6 t
" I. w; M) L1 F7 {8 r9 a& O$ R
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
. S. a4 n0 f0 S1 V$ T* Z7 ?( n z! Y) Q6 b8 y
修改为: t$ P% z' q$ J
+ D! [2 F& [9 a( p% ^
0 `7 u- m5 L: E) y5 lphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"' N" V0 U( W+ e7 o* x
2 w$ x1 }; `3 p% |( D- h$ R9 O) u" a! ^; v% ?( S
然后重新启动 apache 即可生效
, _- B# P) W5 L' Z> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
3 ]2 h" L1 x0 k: k" ^! Z9 L0 _+ z6 ?: c* v3 y9 g
三、Nginx/Tengine 修改方法
! m9 E; f: y% V; C6 ^- k: BNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件/ g6 o& t8 z, G9 z5 V
& B; _. G6 ]* r+ ]7 i' X6 bnginx
. p' Z" w; ]7 |! R6 F P├─conf
" F) n& h2 ]+ w% w6 g; f├─vhost
$ T$ N2 ]1 [9 m3 [├─www.thinkphp.cn.conf
. C% I/ C4 C- O+ P4 ?7 j├─nginx.conf
$ ?- _( F+ y) G1 R8 g├─......
0 N8 p J( S8 E# j/ D% T6 Q% Z├─nginx.conf
9 A0 U- L9 _/ b, H$ F- ^6 s! g
0 s& g1 j: W5 j5 ]9 i5 z+ `5 T1 ^5 ?1 J5 T+ M$ K
打开 你的域名.conf 文件 搜索 open_basedir,把
4 G3 C0 U$ G' V( q6 q
$ ?; ~! r' u! ^; u S( P; d9 W0 m- P: D! U; T3 G7 U
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
" \$ {+ G7 W4 D C
7 X6 k4 q3 z- M2 g$ ]8 [+ f# j0 A修改为
~3 v1 n* n( ~, S8 G0 n, R: J! u3 K; Q. d( i
* z. `. M1 S' X5 M" I7 A0 nfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
, h% D( T: y$ ^" s% i3 j0 l1 N
3 r8 `4 f- n5 B# r& X2 a ~+ t% M. i9 V; j) t6 X8 y8 y& I
然后重新启动 Nginx 即可生效
# S2 U' C) Z8 Y' T, s9 i域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
9 M) W) ^- M; L! s5 r9 X! ~ s4 e! v( v( Z4 G2 B0 J2 e6 U$ g/ l& l/ z D
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
& e; d1 h: N0 Cfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";. w- c' x* r5 n4 f9 V
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;" ?, h- p5 C5 g% K' w! N6 n* y! }9 Y
依然会生成错误的配置如下:/ l& a4 B' t3 |
' C+ @ p* b( Z* y& ~2 Q m
! Y9 f9 ^$ y" y8 F# Kfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";2 ^% O0 Y2 y$ G D9 C
8 [/ f7 ~* |. Y) w! W* W' C
/ X0 ~" E1 C+ l. D四、fpm/fastcgi user.ini 修改方法( o$ J( {9 O; H, i
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
( w$ Q- {" g2 y4 U" W0 N6 D
" I5 o1 L2 g7 F0 k/ p
9 b( x1 V* _0 F# |; @% Copen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/2 F" {( g6 T/ t7 s7 M" [/ J _
$ Z" f+ I, @! f# l6 C
修改为
1 i. x5 U. M9 }. z( N. ~* s; L' S: z
4 x! J! N! H) O I) e% m$ U2 a. j6 v, D/ p7 n8 ?0 V4 W
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
9 d8 {; d8 l7 l/ v4 c) k: i, u- Z; y C9 h
1 {. t& _" @' v# |7 Z
然后重新启动 web 服务器 即可生效!
3 A4 x' \) e- |2 d' ~& T/ J, Y/ C8 f. p4 E$ ]- m
总结:
5 N; e! f2 I% }8 J, d, l- E一定要仔细读此篇文章,否则你会选错适合你的方法。
' N0 ?: v5 S+ q一定要根据自己的服务器环境来选择你的修改方法。
4 }0 u9 t) n: x7 M% X7 j- O/ d% R" Z% h6 f% z6 s7 r
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!% k3 _# d4 Q2 u9 B0 G8 m. n
1 |" `: a- H1 m1 a% Y! E8 `
% T( O1 b: P: s. X4 A/ [' L
7 z L# W+ T- w/ f! p
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
( U) g/ z; P1 m宝塔面板出现“open_basedir restriction in effect. ”的解决方法' `4 \+ H( ?/ j) L# D
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
6 K4 \- v$ M. r9 N7 k* y4 F5 r+ w7 d! h2、必须重启PHP;4 q$ W6 N M/ h# d+ n) Q* T
" k+ A/ u, ]4 J8 E5 L$ x" W0 w" `
* a0 {4 n' o" P, u2 ?8 u* C
9 D: V0 D6 W& i0 R9 o! X' Y! v# t) O
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
* l$ O0 j; M# i# t我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
4 R3 m" V: T# S: V& P
( L; Z: n" p' X' l# {* K( w9 I我的解决方法其实和文章也差不多,原理都是一样的: l5 y% `; X8 X; z
, ] \( k6 ~* i6 A+ n, r; O! Y' ~
我是看到LNMP官方提供的“防跨目录设置”方法,如下:: A5 j/ [! j( \% u3 C$ C/ Z/ v1 R. s/ [
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置! M' A" v1 o/ L \ p, u- y% C
! T3 y, o8 g9 H- v J
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
7 K2 d* c5 L M+ a' k* {: n, J) r# x. A1 x; X" F! g Y
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini: ]$ l0 e/ g) L
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
- x2 p q# X' g删除的话rm -f /网站目录/.user.ini 就可以。
+ R/ ?4 F3 G# x) m: R修改完成后再执行:chattr +i /网站目录/.user.ini
( Y8 ?) c' }2 [, _/ x O# a! v.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。* Q6 @) U* V9 l1 U
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
- O" | c5 S* a9 T. l
' _/ a8 U- G( s' l% ELNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
+ [$ w1 G( _2 E* I3 o
5 ]+ i& [; u9 u- ^& BLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
. E$ D5 m4 f( |3 b在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。% V) R H$ F1 {+ @
( t+ D+ ^; e3 z, F% i3 T3 x
+ J6 L, q8 u+ J$ J j7 C/ @) S' F3 [8 g
7 F4 Y" `# E2 QLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
3 t9 T* {% r. s8 E$ O2 m
" t: J9 w; F1 Y- a& w+ h重启apache生效。 |