今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
9 F+ p/ V! D" r0 ^" k/ D: l8 {+ |2 `
' i1 P) w" i8 Z- Y- T8 P) S
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 202 l- r+ O4 o9 _( w) f9 k) T
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 201 l: ?; I, f( ~6 c5 o* }' q
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
: x+ W# ^2 Q0 E$ y" U0 j Q5 g. K- G2 H' E+ q
4 C, B+ e' e, f, A
% m$ x7 ~/ W0 M, X* d* G, s+ T& w* f- D, C" l1 `
$ }) G. ~6 h7 q: `8 T) H或者报如下类似:
\' v3 _, d- h. k; }0 H& P. rWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
5 N2 v3 D# L! ^; a9 B9 N4 t+ G S' U5 h3 p: V+ r1 d
出现问题的原因:; T& G0 Q: H- r9 ]
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
?6 I: `% q& [一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
1 H+ {8 U8 \" K' h, ]4 B. j! X! ^* c$ S
解决方法:
* N9 b' [9 l5 o* f我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
1 D5 w' V/ s7 T; ]/ G
# b% E' l8 H, q, A如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
/ I/ R" t/ C/ `7 Z( L! }打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
$ W7 C$ D, H2 h
' _) q5 C/ {' O h5 I) U' y一、php.ini 修改方法8 d0 u6 A- @* ]5 t1 A$ ]. v
把权限作用域由入口文件目录修改为框架根目录. ~9 z4 N, D5 O' t2 x
/ @% R3 C9 {& e( r: U& c) k/ C
打开 php.ini 搜索 open_basedir,把
; U# T2 j2 v. \' D3 j0 k* x/ R# _1 y9 M! n5 g
) y: Y+ y& E9 W Y7 m
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
4 e- U1 b. Y/ [" X9 n( i7 E8 r, K) O
5 A# I7 K- `* ]5 P修改为
, |( ~8 b2 D5 D2 @
9 g# {: G9 r2 _7 M1 e# W5 V# B Y- _2 I2 ~
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"$ s* [) d# |; c: l( F) U
1 u: m& Q9 Z/ Q: `- m
, O6 p8 G; M$ t) g4 t+ b注意:
3 h& @# [9 M6 v( X* E9 _如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。) [$ p. N( e8 |5 O& V' p
% _9 n) z" P- S二、Apache 修改方法
! c, W% V) W' g3 t$ D: |4 `# A& T2 YApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
0 S8 Y; P* |0 G, T7 Y' j! [0 u7 @! r! g9 |
apache- q+ f* G6 T+ Q7 T9 C/ M, ?
├─vhost9 v! m- S2 u5 ]* k E6 i' O# C
├─www.thinkphp.cn.conf3 h5 B' {/ x. N* U9 O6 o# F3 \
├─......
" `: l: F% Z" j7 m5 ?5 s' z6 t7 s0 P├─httpd.conf
2 F+ f9 R) H4 F# x" X6 v/ g7 b8 ?" \4 ?4 `3 O* ^
8 s! q9 O1 _/ I$ M5 N
打开 你的域名.conf 文件 搜索 open_basedir,把
! F6 V* p; \- C8 |' a4 L
6 c/ C; ^1 P: Z- d6 H* O( l5 r4 r7 R4 ]0 ~- b$ H' X F8 o
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"& O, M/ m. w$ O1 O* E5 R/ F
- K% W7 O% h( k7 @' N. R
修改为3 z" s' H0 {- {/ a2 D" }
5 {; h& o/ M n% |- X
2 G) C) c7 G, T# Iphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/". i8 [! n1 ^9 W0 X1 ]8 i$ N
" l B. T0 ?, h) K. {
5 H1 q" G. G# }% o( L' o* j
然后重新启动 apache 即可生效# A+ S/ @0 E; Z" h& ~
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置% a3 j1 C: s( S( C" I
. z; r- s$ l. y V p) ]* w) b
三、Nginx/Tengine 修改方法% T$ Y3 r9 ^) j: w
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
8 N+ @2 i5 G4 {% J
( _7 l: \1 Y+ r+ K8 m3 wnginx
+ V/ a* E& q; J4 a├─conf! g D; P3 Z# r
├─vhost1 s4 l( e: S+ G2 X' E( w, F7 n- o8 S- e K
├─www.thinkphp.cn.conf
# m$ _, _/ d2 A1 c2 p, n+ z+ z├─nginx.conf
! t) x* [. m/ D- X7 D k( K4 z├─......
* T# x0 G3 Z7 m├─nginx.conf3 Q. L: [& F) b! u
9 x. w# f/ C" j! ?
; Z$ Y0 f" R% Q0 E" l7 Q8 {
打开 你的域名.conf 文件 搜索 open_basedir,把
; U1 e2 k/ V' ?) y$ b7 p3 {) E
( I1 ~ q/ ]! N2 `( F, i6 \; q& _' _/ c( [, c; ~3 W8 b
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";6 x' i4 o" {( P" J/ i: B
$ _3 P7 K( Z# ^0 v# O
修改为
$ n, S8 o& E9 l X8 ?6 S$ a0 j0 Y# k- {& E# [$ p& z
# H( W* E7 N& l/ \$ ^
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";) N, K9 Z( W: D5 j) O
9 e% a6 n4 X7 Z# D3 d
* @4 r$ p0 g2 _ _8 f& ~然后重新启动 Nginx 即可生效% h- _/ @6 j2 o4 b( K/ t6 b
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
$ Q+ E* ?% |' _; O) n, w2 D# h7 s/ F9 P. x4 d1 G
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):, E( T4 R- b& U3 h1 m3 X: |2 t
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
# g5 [; z4 C7 z1 O7 ?上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;& G5 A/ i n- |7 G
依然会生成错误的配置如下:
4 h, x0 U9 Z2 Y/ I; c2 J9 X4 N0 @
4 I- q0 U) ~+ c8 I2 E" @8 Z7 \5 ?- [$ F$ g( c" c0 B
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";8 p7 L9 S) j) g1 e' D' p) m
' _* R9 i2 x8 }2 s5 \2 b I) U1 q' j3 \4 u$ [
四、fpm/fastcgi user.ini 修改方法
/ a( [4 S7 _0 i+ r$ \0 i; e1 l打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把/ `' l2 ^2 n8 A) ]6 a
* F8 _ o0 e' G
! r+ ]% M/ F. ?; I# ^* O* lopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
* {2 R! a2 t2 w' `( u
1 {$ I8 q! p' [, N+ B4 r F' j修改为& V+ ^+ D( C9 e$ P( o' y+ v. Q
" C# R* X" E- a4 [
^( }' A8 b: Dopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
8 ^% L: R, ?+ T+ N7 w+ M1 s% ]
) H, e8 Y3 U* r* G7 g+ n: V! `9 J4 T' h: ^( ~0 ]
然后重新启动 web 服务器 即可生效!
' d) X. n8 _ s A+ u$ f9 W/ R( i; \8 J6 d/ G4 O- N
总结:( l+ p5 V4 u" I. G5 G
一定要仔细读此篇文章,否则你会选错适合你的方法。
5 F9 j p) ^8 J6 {一定要根据自己的服务器环境来选择你的修改方法。' Y; q& {9 U+ I, F5 s9 p; K
- c, v+ O5 g3 a0 o- {7 `7 u由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
$ O# t( ~6 Q6 [1 L" j2 _& O7 V9 B
* O1 x) ^( K4 c& h" H, f5 c' P1 ^+ v
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。. g$ t; t. @9 }! c m3 h
宝塔面板出现“open_basedir restriction in effect. ”的解决方法' |1 h& K8 |. i
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!+ V8 ]: z) a) y% x* m4 ]
2、必须重启PHP;& P R: ?" h: o6 X9 E- S
" V) z" k" r( ]9 s* W, d5 ^4 K; L C3 W8 V+ Q; Q4 V) E0 I
/ I0 {. f* x7 ~
2 `. a+ r7 Q. U5 \" ]- `
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法8 _ a/ H3 K! p9 o
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
8 F I- S/ [" T( p( v4 m& G. @8 J& f0 E& N. k+ F5 ^( E5 W1 f+ v
我的解决方法其实和文章也差不多,原理都是一样的: e( v$ a. C. F; n% o9 M$ N
. d" e& z6 V, H8 l8 E T$ N% c; X% q
我是看到LNMP官方提供的“防跨目录设置”方法,如下:7 Z/ u7 `, R/ R' Q, _* B! H
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置( x& y1 z0 t* b; x* F4 N. |$ N) z" L. Z; q
* @3 l: S4 G5 o, _* J( f z) F; Y
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。- x; a2 \9 f3 l' F6 H u
5 c: V8 I) p6 U5 c# B/ f
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
2 j; r- F% L9 n7 L可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。! W! C; f& t3 ^
删除的话rm -f /网站目录/.user.ini 就可以。& \% `8 J0 b2 I
修改完成后再执行:chattr +i /网站目录/.user.ini, z# e$ U- |' y3 |7 U5 Q! I
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。( D" D8 A2 D: k
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
7 {9 x% \, d' J8 ~
/ `* d) w& ~0 H U! u5 o4 RLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
! b/ x4 p5 f2 k# H2 _ H
& v* x$ j. u& OLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
3 y# l2 |2 A3 f. X. Y在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
5 E) k( O& f- Q8 x2 D2 w0 i& ?
" Z* M, C+ U' Y6 q5 ~+ H7 u* h0 M; V* {3 `0 D9 L0 v7 `
+ Q* H6 o5 D+ Q" z( H4 K0 ILNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
' u8 W5 D1 ]( j( {' t4 s
0 y4 Z1 J) ~8 l$ j; ]# E7 X" G& `重启apache生效。 |