今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
) E3 i( ^/ i+ A" ?9 @( ?" L5 x j/ I7 U' i( ~3 \
. i6 y! Q7 M- H0 @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 O6 @% f, y6 UWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
: ~7 {- `/ y7 d# G0 rFatal 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' U j8 ^- M& F- B/ K/ G
; X l2 g% {8 c& o. I
& v2 o5 Q2 e: T$ t: G
9 |2 _. k% h# V+ A$ P, P& T) x D- M
; k' B* z$ C- ^# m或者报如下类似:
3 q2 P1 D i2 r0 S% PWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):- y/ ?4 w+ X6 z" R" c& W! T
$ r2 b- v$ |3 k! i
出现问题的原因:, Z v; n: g0 s. b( }- r
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;$ c" q" m% L6 n5 ?
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
2 e! S2 b! g8 P
4 q8 N; K) \" z1 {解决方法:
1 T8 a* K$ F$ x7 g( s, H# O我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
9 R- i z) }, [6 S0 Y3 M8 ~
- K$ ?. M- E! F. @如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?* v4 A/ q9 K3 U$ R, u5 I5 E; Q
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。6 o7 K5 Y" m7 S
G9 \8 q# v" u. A& i; K
一、php.ini 修改方法
8 ^3 Q" z7 Y- e5 t把权限作用域由入口文件目录修改为框架根目录
1 |8 E$ X; h7 ~( v
$ K j9 f2 [+ }4 L打开 php.ini 搜索 open_basedir,把7 u4 n) D) X1 m6 f
3 G0 V/ D$ `8 e' m2 o! _2 p6 O+ A& h/ a% t: p0 A/ s$ O/ V
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
3 P* J' f$ H/ o! T9 Z+ R& y3 Q' n, k% [* X' ^- t# f! L
修改为, K+ A/ o0 F! ]
# K5 N; F5 A7 T3 W5 {- u6 Y% p- \& H7 n
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
9 Z$ e9 z ]9 x1 A1 T9 W! K* K) g: ?' D
0 b7 Y B# {6 X1 b注意:
; O1 B% U; O, p* t6 C1 ]如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
x( ~, ]5 I: `; P1 ]+ u& Z$ J8 ~/ \6 J& `
二、Apache 修改方法8 b/ S/ w( s2 k |+ Z/ p
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
" d) R2 D$ \8 D$ z$ u a" S% ]0 Y2 e7 e7 h- _
apache5 N" O, C% \5 o0 D2 N
├─vhost
& \ Z- Z. }" E8 `" q4 a) Q├─www.thinkphp.cn.conf
+ `7 O" W6 F4 u9 v- N├─......5 x* J( Z' I% L- _
├─httpd.conf
# b8 d, O/ C- u# }" d9 @2 [$ Y9 O/ p! X1 J$ Z5 s
% O" }8 \1 Z' U0 L" `% n打开 你的域名.conf 文件 搜索 open_basedir,把
% K, V. J$ m) a% ^- I* `. ?* j0 f$ t1 m# a) ?/ m
- }8 ]3 D, ]) l9 R: L: N+ |3 pphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"5 `8 B* o7 q& f$ t- A
* P' z" D7 e& S, [
修改为5 e# J; V3 L' W' z& Z3 a
+ j( A/ w2 } R+ e
3 |# ?( B" E' r" ?php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
. T/ l+ U- |1 A
* n l' y) l, {. G# T( i
& B( f6 \! @3 R然后重新启动 apache 即可生效
' x# R$ {) C# l+ `) a1 Q0 A, ?: j> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
+ ?! \+ a( Z! L3 L4 S
0 E$ J6 I. v1 t$ n三、Nginx/Tengine 修改方法
( ~& K/ h5 y# s# V) F6 H% E* c" RNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件: g+ x7 }% ^& t9 E8 `' i
% w# {; d) c# l( h) Q% f9 Z2 }nginx4 D7 B4 \, z! _/ K
├─conf/ e* E: x. H$ Z0 i; z
├─vhost
' U. J4 K5 i, l/ ]8 @" T+ u├─www.thinkphp.cn.conf* }0 Z# d6 D \( i3 n
├─nginx.conf
3 R9 }, J2 _: H2 d$ n├─......1 \6 X4 f' `: D" G' V
├─nginx.conf
5 L8 A5 p/ N$ [" r7 _+ a- r8 \. P. B* S0 @' S. q" h( E6 N
6 g7 P& f8 h' ]" g7 J
打开 你的域名.conf 文件 搜索 open_basedir,把
& T5 T" q! N) Q+ Y0 h U N! \
) ^* \: m8 |+ J3 w; a4 a3 s
, z1 j' h( e# S# _4 Z) o; z. ?fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
+ J7 P5 V7 ~+ V2 u s( Y4 h% t
0 {% c; w5 X( a" G* W- \修改为
" i5 j/ k3 f Q: u0 `
, J5 C9 F- q5 b! m% D
5 _. l* t" L7 K& ^( Gfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
' L3 P- q* m* M% w( [( h% A7 X5 A: y, O: P0 \0 j
; I5 F0 h" _4 P$ g* k1 j然后重新启动 Nginx 即可生效
; g# C5 R! v" H3 U2 Y( ?$ ^; M, C域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置. N% I& ?* w {! `7 d% L
# y/ M0 Y7 Y1 p7 U4 p
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
# P5 H- X' [. p& s+ J% y5 sfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";2 k+ \1 t/ Y8 A$ ?9 n
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
) u/ l% Z# P* P+ y; X% c, Y) K依然会生成错误的配置如下:
& K0 C5 |, \9 M+ b. o
# I" i0 u' ~6 e0 J( l. Y
7 T% A5 n: i2 G- lfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";; \: E: ]. p3 r! {5 c
6 G c& W; M$ }3 i# n3 n
* U u4 |) f# _$ i$ u& H, w& p. I四、fpm/fastcgi user.ini 修改方法 J' S- r& r3 U) `
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
1 z. v7 S6 X& l7 H0 {6 F0 N" ]$ t Y+ C" J& ^
! ^" f- v& C( M7 ?8 r8 u! }: H! B8 eopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/9 H' J( m. G$ V+ L4 i
) y5 U: N6 c& A6 ]修改为
7 B" k4 o, P! c" j' X, i
" Q4 ^8 V& J# F) x
I+ }: i" y4 F$ wopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/! U* {0 j7 o& r) F9 O) V
" H+ t0 t! O6 _ T; R* |. k# B# `' o( ?" I
然后重新启动 web 服务器 即可生效!+ K+ K1 s+ M7 a: o; t: b1 K
% z* T8 f" T; s$ M! G总结:5 F+ {9 U" G- O/ r
一定要仔细读此篇文章,否则你会选错适合你的方法。* k( G$ _ T# k1 c4 s$ Y
一定要根据自己的服务器环境来选择你的修改方法。, V( @5 t1 ?7 X/ H( s
/ b% B! f3 s8 y3 u, Y
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
( q3 C/ [ I4 H. h4 r8 J
; x0 g. w1 j& I/ ~5 Y& m! {8 I$ E* W6 i2 ?2 M
8 a8 p5 [9 Z& Z$ M3 S! J最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
+ m( |" I# {5 N4 }) R- c6 g宝塔面板出现“open_basedir restriction in effect. ”的解决方法
8 C0 W% ?+ r5 `) h1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
: G- G9 Q; ]0 P6 K) B8 V x2、必须重启PHP;
. e Z* X% x* N& M) b) n, L7 n* O% C! I9 x
: Y" U/ u+ v" a6 P) ?- n
# B3 H( U1 v% @2 D; N9 ]
s2 D9 J/ c( n- w4 y5 @' d+ a
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
# }: l+ O0 G# J* Q: c) m8 ?我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;. o/ M/ P7 D9 B( }. m7 i
3 l: z+ _3 ?- k1 e! F! I9 P1 A4 ]
我的解决方法其实和文章也差不多,原理都是一样的:" d1 A2 @% J+ f9 `
" k$ k! {0 W5 q! K0 T
我是看到LNMP官方提供的“防跨目录设置”方法,如下:/ T1 @ _5 n4 J- @
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置7 z7 B* {5 {0 R' Q2 a0 y
" @! P9 b* N5 }; U( W: q5 H6 O0 n, }LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
6 w9 @5 M# L* k# p O* m; Z4 M2 x. ~" w, {, [, l
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
' _+ d }5 G9 Z/ j% G9 L可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。; y+ a% [2 v1 [, b; G
删除的话rm -f /网站目录/.user.ini 就可以。
6 I: h+ }7 s$ ?7 a, B修改完成后再执行:chattr +i /网站目录/.user.ini, m6 o- o# N9 C* _
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。' H4 O3 P( b6 P- y# J, Z& T/ m( `
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!2 U0 ~ e& W) Z% g* A
! }$ U( C: M, R: s" x! d3 c
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。9 w' X; p9 z# n, r8 E
: [3 o! j" J& d. qLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。8 D5 _6 p2 u, _( |8 p
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。) I& Q) J/ d" [8 e1 X6 T
! U; P5 q/ t- L5 L9 h# N0 ^) ~) L( e" w8 p; D
; v+ }) m0 f; T/ R2 }$ SLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
' g& T3 y% r+ g; e# k$ P! A& }' i' \3 V+ ^% k& m0 x
重启apache生效。 |