今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:$ Q' U j$ m6 j9 W
- i5 G4 U" N, W6 C( h) z6 l( d' I3 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
5 s( X! J) c& H6 FWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20! x" h% V. ?$ D a
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
3 i; T3 _, {& F1 e1 s8 G: d8 v" X+ }* R, F; \, g4 L
' m6 L6 m. {2 `, ~6 x' ~2 H1 s6 v; U+ J& [
+ m9 g$ n9 ?. q& H. j( q6 A
! }& a! o, N+ T5 _0 I1 } h或者报如下类似:
; `1 X; ?8 ~! s9 e p4 j# Q) ^Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
& b- ^1 K e! {. E; Z9 C% X& P( l& M2 O# r8 O: d
出现问题的原因:, \+ s4 u5 C0 T
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;$ E8 L: X0 o3 J2 ?* Z' o9 C* s8 \
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!3 R% [, m# P4 x! f+ I
2 {4 ~9 _ H' E- x解决方法:% ^+ B# p$ T; K9 ]. W
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
! d! T* q0 }$ E( i% U5 [) h+ J6 {0 `% H, U; t, b% @
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?+ ]: u4 p7 U; J; T J
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
, r" K* @) D' }" z0 k8 X, ^, }; `4 ^% ^! M E
一、php.ini 修改方法
. ?; v9 b8 n* _% q/ \把权限作用域由入口文件目录修改为框架根目录; x- R) x5 e+ J; j8 P7 \& X
% d8 |' ~1 i% O( J8 @
打开 php.ini 搜索 open_basedir,把
! }) f* ~' Y! V# L, _* ^6 ?- h% X+ ~! u) i
$ b# v& L% F' s+ w' c* w# G
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
' e4 i0 N; T4 x, r
U/ f y, a: Y" W; L4 F. ?修改为
, ]8 x, Q2 A3 B$ I2 X7 x* A1 `' [
- C. j, D9 L' r0 `% U! ~3 gopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
. B+ F3 ^1 e5 @; O7 i4 Y1 t" L2 Q4 M v" w+ Z1 t, }9 T( J
3 ]' ?# k [ m; f
注意:1 Y) u9 j) O+ y* Y) G
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
7 e4 a. |* W3 v9 ~0 G; z0 g: B* O9 T1 K
二、Apache 修改方法
; E7 D# u) M6 w K& ?Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件9 D" \. f% e9 ?* N+ e# j" ^
, r! X( {9 Q9 R X: [apache$ y8 W3 h5 E q2 @, @
├─vhost
8 Y# |0 \. S) s├─www.thinkphp.cn.conf
3 V' O6 Z; l- v7 i9 ~├─......5 P7 W3 ?9 U, m- t0 S& k* S4 m# Y" q" @
├─httpd.conf
1 k4 h( i# c* B/ d9 j* I! \* o5 B/ s9 ^& A# N* [
/ { Q9 Y* w& b: z3 Z! e4 O4 h
打开 你的域名.conf 文件 搜索 open_basedir,把
+ F0 F3 W( G; a- ~. }5 v) [
" _, y3 Q% e+ N8 y% V% x
; u: L% B2 B8 a2 Fphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
6 |( o w) ~$ E5 h
/ L* w2 l1 N& V- y* V1 R修改为
! j% u7 Y2 J$ q, n! j- Q1 G
" q5 [% a( z4 U+ s) }. l
( i- {& ]* }) }0 z0 g+ uphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
$ i" d. H: ]) O9 |- d5 K' r$ r( }: U2 z
n) \+ J0 C, P2 L& X/ |; `. D然后重新启动 apache 即可生效. ~% n6 H0 k( N
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
1 F( O0 Q, i! I8 j1 O1 a2 Z, l
. r8 i8 n) g7 F+ f0 C7 x% x三、Nginx/Tengine 修改方法6 c/ T& c" i7 F. a; J
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
0 F8 _9 A1 `/ G7 y2 W1 o+ |% F( O
c* X9 p3 B2 L6 |nginx- }4 R% C" I7 D
├─conf
! |6 I6 e( O: ^" `( D: b├─vhost
+ W2 ?! [; `0 m4 \# ^, I/ }├─www.thinkphp.cn.conf* P2 F( Z' e: C* G
├─nginx.conf" B7 @& ]# G3 h9 ?
├─......
/ m ^4 b$ o7 |# I├─nginx.conf% r! b; p" b: K" R0 \
' v2 \6 E- [ H/ G6 }
& j' b; |; p, ]( p- f6 W打开 你的域名.conf 文件 搜索 open_basedir,把7 R& V- K9 d+ |, M4 u+ s. |) O
/ v# [0 _7 H1 Q T
& T* x& h9 k; W: r- ufastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
+ V; l' J/ }. e X0 X& p2 } F2 D- K7 X7 f; a
修改为
- m4 [3 t+ i- l4 g. R3 n( J/ ~$ g) ` L+ m
' S( M9 Q. T* D) d" B4 e
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";. A6 y, S) _; `. {
9 Q1 s% V, l% `" z* E0 s1 [
( k" X- c! X' ?6 Q2 o% U然后重新启动 Nginx 即可生效6 `! q+ X' J* K# a
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
1 W: u; A! g1 J/ Y# Y" c
7 C% ^! ~* D; \5 z% t. a$ o) k注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):" }$ B N1 G6 }9 u- {2 c
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
- K# |5 H0 ]2 [1 V; t1 Z, x; ?上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;0 b9 S- K0 E# I. h, `- j' h# \
依然会生成错误的配置如下:
6 c* @3 Q& K; _- t# ]
" K% u. x- m2 u4 i- d3 Q) l) u
; }4 l4 w5 U) Ofastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";6 Z9 z4 c: q4 K& \, M6 p# y8 I- n
3 w1 E6 [; P" T* |) w
1 Y$ G' y! X$ F4 ~ N: T+ @
四、fpm/fastcgi user.ini 修改方法
0 r% b8 N }( L+ W3 d打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把' r5 b; q( ~- f2 Q
- y0 @: U3 |, M* U2 i
1 P" l, c/ N0 }2 J" U/ L
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/: H: h" O+ B6 k3 T
# l- q5 `! T, _2 h( X; b" }2 ^修改为) f; j9 `' _0 o, ]
. N' @* z# {9 w+ w. ^
- ^) t, w R I6 `0 u) l2 G
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/& i7 J# y1 }' x- O' R6 i3 N
8 h: R( {4 O, h8 O/ M- w+ ]( N0 F3 g
然后重新启动 web 服务器 即可生效!; K7 f5 @; O$ `: X
p' O, Q* X& S. o* Z- }总结:
$ {) e& J2 U1 w- z6 u3 _. z8 j; w一定要仔细读此篇文章,否则你会选错适合你的方法。
7 e7 H% z+ G$ B0 |/ G0 A一定要根据自己的服务器环境来选择你的修改方法。
}2 v$ _! \7 s3 Z& e7 j$ ^5 R/ G& m/ ] T
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!: S( v- T1 N2 A6 q% C1 d; Y' M4 ]/ z5 P
; m; @& W, O8 H( K. ~( F8 V, m4 t k* G
* E2 |& A, ]' B5 j1 W+ ]( H* S! w% m最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。$ L- s, q4 o. S1 D. s
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
" G1 q" b3 b: E" C, [! p1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
$ b! `7 q" ~; `8 u$ F2、必须重启PHP; e, ~4 z, Y" R/ a; x
; D" |& t& o I8 g1 Q& R
9 M3 S: G3 j9 m" L2 Z0 D+ E6 x& p' r2 K
/ ]) h. e+ }/ lLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
8 v9 H1 ~' u" X6 f6 T) Z我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
0 n( k0 ]; q2 }# O _/ _7 D7 U. |& f; a1 M$ Z0 M
我的解决方法其实和文章也差不多,原理都是一样的:
4 l" [8 `: z! Z: X9 Y: ?# P. x8 I6 R! G5 }+ K9 B3 i
我是看到LNMP官方提供的“防跨目录设置”方法,如下:1 r0 \! N4 Q5 f9 w5 R- t0 _
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
$ n& E8 d+ w0 t2 G7 Q6 Z
* y, U, Q; g( k- s" h" |2 NLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
n# @ u* o s( O- S# y% ]6 H- C0 x2 i$ e
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini( i Q; n* S1 `3 B8 U8 A
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。- {. i) a$ E0 h- H$ S+ {
删除的话rm -f /网站目录/.user.ini 就可以。% i# d' j( _3 D+ c6 @6 Q
修改完成后再执行:chattr +i /网站目录/.user.ini
( d4 z' z6 x& t.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
% _; j/ c) {9 s) {8 R& g3 ~% y如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!& b+ k; B: p* b8 q2 d' {6 x
% B( A; z9 h8 ?5 K/ k
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。% A/ X" T* L& s/ e) `
- x; m7 L) I/ @1 c& f
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。7 D- H, r2 J4 @8 e2 p8 Q* l
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
; X! @' [. {) |/ _5 s
4 |; E) n: c6 g+ a
; C) R% {. t( W, r. v# n& x( ?' i
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
) m& W2 \ s0 z
( D, s# t4 f5 b) j, [0 V0 N重启apache生效。 |