今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:8 }: A3 B: f7 |9 g/ ]
7 `* _! ]/ ~2 f' h; f* y4 b8 O1 i5 b# R( b. A
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; v1 T; {+ O i- R
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 Z: N) i) q( ?# r5 }- j) O" ^' 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 20# ~) q& G1 q: j# z. h
. R9 I" \$ @ B; V3 P: X" _# u# {: F$ O) V! A: x
- \1 m/ D% `' `* {, M/ [* x2 C2 ^4 u0 ]: \1 k1 @
2 X9 c6 Q8 K+ Y/ w
或者报如下类似:: ~1 n( [) B* e0 S f7 S- K
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
% `$ r' R& u. D! F$ U8 y) I3 M3 z6 Y7 {3 }% O3 M# }( t0 d
出现问题的原因:
* V s5 T7 `6 `. B, r$ r查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
/ r0 n# f4 b5 G4 H% k) ?一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!7 U5 h% S7 Z6 p6 U; M( I; l3 |) i
( x8 I' q2 @# S$ g: f" n/ y3 R% a解决方法:
6 D: L! o% @4 ]' {( }* i9 G ?7 n我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
- T! z- V Q( _7 T( O, E" O, V
- g7 ~, R3 t6 R7 r如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
& Q, E8 c0 u9 M- F! A3 g5 y打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
6 [; W; n% K- p ?! f' n- F8 y" B
9 @" ]% C3 k5 c* Z X1 C! R一、php.ini 修改方法2 L$ Q( o" h# g/ I' f6 h
把权限作用域由入口文件目录修改为框架根目录
' t6 i+ b# b& s, Q$ k. @+ C. G# A, `% j) B
打开 php.ini 搜索 open_basedir,把
; `" _1 C# w2 b/ c# O M M: S3 O7 {) M
" ~* T9 I; a: R
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
* r7 l; I5 a! v" J* w; J8 }! I- H6 ]6 S" c8 o' I" [5 X
修改为
' l. D/ `7 W5 Q( }6 F) z( D$ X& H: l9 j
2 X3 J2 O. y3 e$ _. j+ R
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"/ S x* p6 ?. P7 q9 L* q
+ F+ c7 {" d; ~! N5 u# S' O; S/ I3 L5 E
; ~1 _$ D; |! D" M% @ N' {7 s注意:
; ?* m+ b% L9 N* E如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
. r: l) t, |) u2 c
9 W' E8 B) i0 K1 X* `二、Apache 修改方法
4 V6 k* U$ w" @, aApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
* q0 i2 C. ]0 w
6 B g9 N/ t) z+ [$ Xapache
# j7 _6 W$ L. }7 U) H$ I3 ]├─vhost' e7 _& X* S9 ^9 r: W8 W) g% |
├─www.thinkphp.cn.conf
W: t+ h; P* q! c0 k% a3 U3 G/ B! k- l├─......
& @' `" `5 n) y6 w, \: E; u$ f├─httpd.conf
7 r) y2 b5 M1 g. U& p. p3 H# n0 m' x' p* P- ^" L9 f# i
2 n3 r$ ^3 Z/ W8 m打开 你的域名.conf 文件 搜索 open_basedir,把
& t' K( |% o. J7 V2 I1 t8 z4 v: K5 s( B6 _ ^" q
% N$ Q7 R. C l1 T6 M
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/" Z" f$ c% V' x
% w% N3 D' u: Z( }
修改为
/ g! P6 @) U# _ S2 v- b; i5 o) n1 ?1 q) x& b
6 V. @% e: c) _; r# a" {% e
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
; h% a; J5 _: o. z- d5 a$ Q1 o1 C1 V; X8 E- y: s4 |
+ [. M! B' C. `7 a* ~
然后重新启动 apache 即可生效# E7 v% h1 i2 V" G/ Z4 I1 A
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
8 v) Z# v& }5 ?. O# f" k( h1 @; G$ }" Y& o
+ s4 W' K5 s: \5 D' l: z三、Nginx/Tengine 修改方法2 A0 T; L* i% ~* h# c
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
; F% a5 a6 B2 K, `; z. ]
! J. u) z0 P: }nginx, S& L( |5 N& H6 q
├─conf
" [5 v; n8 n$ [├─vhost
' _/ u3 D( ^) q: v. m0 E7 z├─www.thinkphp.cn.conf
5 ^' y/ a2 _& F `5 e# B! [1 Y├─nginx.conf2 `) f4 F/ T& L8 r& T" b
├─......
- P( |& F6 a& L: r├─nginx.conf
: ~9 x' l4 I/ O4 n% v: B) h7 G
* z. G. Y& u' x$ q
( |& I% [( @2 ], z1 W打开 你的域名.conf 文件 搜索 open_basedir,把
; p9 z6 _, x6 b7 d0 B w
0 u# k0 n d, C( |, G+ G( i4 n4 q. N) e0 H* @+ F F) c4 u
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
8 g, n: c* r @0 _
8 Z x# \7 V# r* b& { H( y修改为% v/ b, Y% Y* Q" d& `9 x* R
# V+ h# r! f$ }1 {! A3 }! o" |7 h
$ ~% G8 E; c5 c# C
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";0 X% u! @0 J" n' V7 n; m, F
& C0 x, Q. m0 @( ^# r$ b8 K) a. i
1 O& o) P B& }8 p. B3 S然后重新启动 Nginx 即可生效
8 r3 F( y" f) H, o N Q域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置. G5 w1 B& H4 ]- z- L4 @! H3 s
& U) D( a: F" R% B
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):0 W" s/ z. v- Q! j
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
' h1 `3 A0 X+ `* ?8 G3 _; W& z上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;/ {3 c* ?3 D# ]) E2 h6 Y
依然会生成错误的配置如下:' y6 f* o Q/ k; G. z" [! o
) i( ~9 ] f. k6 e; `* V
: }' L5 L# \3 P# ^
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";6 T& O& D; e, z9 g7 X
T% T& w' J9 Q3 l, V
* N7 y6 n4 c) c/ p四、fpm/fastcgi user.ini 修改方法' s( R# v& x" X! z! ^1 b
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把8 O1 V& j1 s1 H. T8 s- v
" U7 V1 u% X; @
' V3 \* w3 A+ O* Q' q
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
# b( b" r9 N% ^5 a& E b7 h& }8 h' g" g* V2 Z+ d$ I. ]- y1 b; u
修改为
/ j( x$ ]2 V3 C3 ]! `
' b! t& w. L- @1 L) g0 X/ z: E- B9 \0 a* ~% E+ p9 N
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/' [9 x+ O. }# p$ k2 p, e
/ }+ x* }. `( n2 l) d2 d7 ]/ b, _
+ i3 c1 Q6 E. l& v6 G然后重新启动 web 服务器 即可生效!# _/ {" G# [* r7 y
& o5 t1 E1 V- i$ j. o0 ?总结:
* x" t" N: c' s一定要仔细读此篇文章,否则你会选错适合你的方法。
: I' S B7 a1 Y' I: ?一定要根据自己的服务器环境来选择你的修改方法。0 s( Q+ O. M9 W! P. o5 Z6 L
4 p; C! k5 b) B z; O" C. W) n6 B8 @
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
! u$ N6 U: d( o5 h2 ~: F
- ~- B/ y& L2 J
0 q' Q# r, }: l, Y
# `( T& l" ?3 _( S! m u% Z0 K最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
( y4 ]$ u% m5 r: V$ d$ Y- [- p宝塔面板出现“open_basedir restriction in effect. ”的解决方法5 W9 X% G( }2 x7 ]5 p3 `$ x
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!3 ?! S6 }) S# P" Q
2、必须重启PHP;) t7 F' h* {, l8 ?4 P
$ [6 i5 \' q+ b W! H& J" F3 Y; U1 [" [/ d" {4 {! S5 O& k9 q- Y
3 w8 @) U- z' a( f! C
0 v1 a% x$ _' U0 v, H3 xLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法* p W p; K' @9 ^
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
& w7 c' m' u/ F' y% A6 D q
j: [* f" A* g t( ?3 i我的解决方法其实和文章也差不多,原理都是一样的:
- l6 `$ ]9 x/ \- W1 L
" u; n1 c5 ?4 V9 s6 D我是看到LNMP官方提供的“防跨目录设置”方法,如下:
3 Y$ x3 I8 Z# T/ Z3 g1 HLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置0 Y" n$ Y- n! ~" _
X( P8 p I/ `3 F+ E9 oLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
' `: ~8 K. V8 l7 T4 S2 H
) u+ b3 C1 O) Z. a/ A.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
3 ^2 X! w k/ y3 U% n# c) Z可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
4 E o/ @+ G; D2 I删除的话rm -f /网站目录/.user.ini 就可以。, K* H2 q% d# P3 R
修改完成后再执行:chattr +i /网站目录/.user.ini
! w3 m0 p/ y& S.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。3 U) ~7 ~- @/ ?1 Q# I- U2 x" {% [5 x
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!8 ~$ g+ b2 n Z4 C- b; o8 I
3 d" q( D1 y+ D& _( R/ G6 OLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
/ G/ R: o: l# G: ~, B" S# ~* b% l& t+ U( R! y0 c X+ ?/ G5 d
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。$ e3 Z6 I: ^5 S
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。- ^1 @: x0 Z, u" q$ ~' B4 g* j
1 c1 p+ d& g) e' t: {7 Z
$ N1 _; Y) ^$ b) D+ U9 {7 g
5 p, x4 p) a/ y' L+ _0 l' KLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。. h: ?1 t' c5 y" R/ j
5 V* J$ s9 v( U* g重启apache生效。 |