今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
, U- R q2 H. D- |1 ^3 u p2 ]. c/ M" X/ G
( |& t/ l9 U) b+ wWarning: 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 _' S# @4 | 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 20
: R/ r( w+ t/ H' X& j4 x, J9 DFatal 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 207 C& D$ H m5 g p1 z, J+ Y
0 Z0 n% q i* V( Q9 t) a L
7 U/ f/ g5 D. l2 f! L4 P1 g9 X$ O- q* y7 y
6 O: g/ @" N& k0 t- ]0 `- A
9 p$ y! l: b; ]2 R/ r# t或者报如下类似:
) S+ V/ V7 E0 U6 m0 I8 [Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):3 O( M5 |, v" K E9 g2 k! D: Q; z6 t
( n: L2 r: f! X- `3 k- e出现问题的原因:7 z, [5 Z2 { R U7 C+ j5 x
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;! _8 c8 l$ J5 p- c1 a
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!: \2 m4 a1 X5 b0 J( j o
# a" F$ ]/ ?: x% s; y" M
解决方法:) s& u' X$ k3 S$ f- v
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
P l4 t9 g% w6 ~1 }
2 K8 A6 K+ c3 j如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?8 O) h! Z3 ~ c+ N6 t h
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。0 m) I2 T' S; L/ r1 w7 |, `
7 x9 B) r' H3 [1 z" w; {& N一、php.ini 修改方法9 m& V* ?1 R' d/ ~
把权限作用域由入口文件目录修改为框架根目录' I3 z+ c0 D+ b3 j$ Q& h# U) t
0 A1 w; ?% B2 E/ }: b$ G; [1 t打开 php.ini 搜索 open_basedir,把
1 E! f' _" D9 g6 b( |* Z/ g' v. r; h) w, Z
" I: R+ ?# q( k5 ]open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/") q: D% Z: G- g' [
$ H+ u b6 G6 u! u( U
修改为, ^* O. V$ m' f: K* {
5 w: Y2 z% E( i1 ~; I# r
& R }* j: k; ^3 iopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
! H8 m# `0 S4 \6 O2 s5 J8 p- l; p3 }9 u4 P6 }+ l
5 t, l2 j1 p4 D9 I* y+ B注意:2 q4 T, }# e. C6 A
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
6 X% B4 [" h! ^5 {# y0 J) a4 R$ @0 E! p- @& `
二、Apache 修改方法: U" s) m$ `4 I. ?8 O M& h7 ~
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件; N9 i0 a- A6 N" C" w8 f! `2 M9 {" E
0 J% v7 _* t& _0 j) y9 P1 U; a
apache
# p( v* H! q3 R1 b+ ?, n$ D1 D0 H4 h├─vhost
& O, H# o; |+ P+ F├─www.thinkphp.cn.conf
8 n+ d8 @) J5 w- f. C1 j├─......3 S8 c) O- ?4 B/ W8 I) r7 P" M
├─httpd.conf6 C5 ^1 F' X/ j' k! N5 @
- z* o7 x3 D- h) ]0 E9 r% Y( h9 g& j D; i
打开 你的域名.conf 文件 搜索 open_basedir,把
- z/ [5 Y9 W1 ~0 y8 t4 x
& t# ?! ?8 _- W' A/ u! l! }. m3 a: I# d" a& F7 t5 |
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
7 J! _9 l4 R' y3 N4 h) q" {- p/ c1 L1 G( M$ S2 {2 `
修改为
( x* {: T( ]- w7 [" j! Y' _8 ^
- O$ ?+ C, F4 b5 V v4 p* X! M4 F5 ^
, F# g, V) a4 w, ^0 m6 \php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
2 |1 M1 Q" N( G+ i- l, \+ M
+ `; A- H9 S, @8 n3 T k
1 t0 j8 E( Q1 t: T; d. J然后重新启动 apache 即可生效: U4 E; b; S" d- O# N: H. o; ~
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
4 U- W+ u& N' {' C! a6 ^2 X( w$ C/ f3 W. M
三、Nginx/Tengine 修改方法
8 l+ J' b1 U' `5 ]! cNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件2 K1 S" P5 r$ Q( S! |" ~
3 }% E) d0 W$ A- U# znginx% {7 d; C3 u2 j7 n. Z$ S8 v4 P9 s7 w
├─conf6 E; T% x, q& }1 {8 ]8 { g6 f
├─vhost, O7 l2 M! p+ Z4 O0 T
├─www.thinkphp.cn.conf2 Q) t O9 c$ u& k4 C0 G& k
├─nginx.conf
+ y- B) d( q- G& ?$ y├─......) i" B' }, M# w v# P
├─nginx.conf
5 x; ?' ]4 ^0 G! ~+ R+ T8 x6 [0 T7 T1 J! M, `
/ _% B; T2 e- s
打开 你的域名.conf 文件 搜索 open_basedir,把
' h' q) q; F4 B4 x9 d [ F0 ]6 P% z; L5 W
; s5 S4 @$ j' n7 K
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";5 X) X- h" y% U+ g0 R' o
# i1 }$ F4 Q; s: {
修改为' E4 n, r' C" f y
! W6 \4 P; J; ~( `
( p% C. X( y; F- a& l& T0 N
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";- I$ o5 k# n/ ?8 r
" V; Y% ~9 U/ H g. E' Y
/ }3 \: Y+ H6 s3 a然后重新启动 Nginx 即可生效; G' h% u/ L- `- p' A3 n8 Q0 z
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置$ M3 L. x* M% x0 b
/ k5 F- T3 j0 b; [! C
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):' {; Z" [) B( G1 u V
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
" u. f6 Y& G8 W- [8 K% ?, |4 l- f上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;9 _1 j% g& I# y4 r
依然会生成错误的配置如下:- h. @# T5 |0 u1 m$ b# f
+ \$ V/ Z; x+ ]7 v) O- k: V1 ~8 N8 x H2 @+ A
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
- F& f. O1 P) A6 r3 Y
6 j) s& ?- H" u7 D' m$ ]/ ?- O9 \, L, O
/ v! Y! [% x/ I* o: Y" t+ e7 d四、fpm/fastcgi user.ini 修改方法7 U' P9 \+ t) r
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把" V$ x& z. P2 m; k0 o
7 F6 _$ `& |2 {$ m( z' V: u: o
8 O. l& _5 G5 W+ i9 P( U$ hopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/+ Z/ K# _4 I7 I. o }( W
8 {8 f/ a% m/ M3 o: U2 w- X
修改为7 h; o" Q+ U l7 A2 T. T$ ?2 i
* o, j2 b2 i/ b6 ^9 D
7 t# F2 T, ] m* x$ R/ I
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/ _8 o1 ^! M( ]( Q6 y w9 n9 f
0 K& c$ V9 n# {1 N
5 j- B! T) l- T. `& ?然后重新启动 web 服务器 即可生效!
' ?; n+ ]2 S! }3 m. _1 n9 f3 R+ V( a* s g2 \4 y/ z7 Y
总结:& A" x8 R8 w" ^3 Z9 I; q
一定要仔细读此篇文章,否则你会选错适合你的方法。, j- S( S8 }% M$ Q4 G
一定要根据自己的服务器环境来选择你的修改方法。
( a) B0 k# O/ P: [6 a
$ y. v+ j3 y* J7 u8 G4 y由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
% B# W; J, f' E2 U1 J- m
N% [* P% x }+ G- l
3 X/ n V. N. W0 C/ u7 M/ ]" V9 A; m( C3 y2 L( Q6 Y
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
% E0 c) w$ G0 d* S) J宝塔面板出现“open_basedir restriction in effect. ”的解决方法5 r* X/ J6 i- X0 J& d) @
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!1 [. m0 @+ r8 _
2、必须重启PHP;; m* M7 O7 p: {+ G
7 E, u6 y+ D! l* y
% P, s( D3 V4 p( k
- a% P3 S/ k$ B7 I3 Z7 D% S, s1 f- t: u: X9 h# X( O
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
3 |+ g% w, e0 e d我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
( |; {# _( X' w, _- V
9 A% F3 p5 b4 m+ s$ |* L1 V我的解决方法其实和文章也差不多,原理都是一样的:
! i) q4 k, b/ t m3 h: P" X* L! Y+ s+ n5 ?5 W) @$ _8 r4 p# d
我是看到LNMP官方提供的“防跨目录设置”方法,如下:4 J9 J3 R2 k+ [
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置) ^; n/ A. E- M
2 R, r# U+ A8 ?0 v* z/ l0 vLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
3 w$ K. I3 r0 z# t% ^ P5 o' X3 K# ^' c! g: S$ H
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
) `% A) A2 i% F- z可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。7 ~ f+ |4 u( N9 g& v5 c. m
删除的话rm -f /网站目录/.user.ini 就可以。$ Z6 r5 k4 I7 I) a; P( K$ x( P
修改完成后再执行:chattr +i /网站目录/.user.ini
" N! r' L( k! u6 a% s* q* m/ z- B.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。# E m! ?* S0 ^$ Z z+ F5 v% ~8 b
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!7 [: x4 E4 G+ b4 \0 e
( I: L, r- ~2 M; c/ x2 DLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。% Z+ A0 `- E: U- o" O1 s" H$ ~
& w4 b9 k1 }2 }" ]# X2 mLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。, E7 r" s) ~/ b4 ^' i* k- b2 Z
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
( c9 c9 B- i8 _1 h* d0 M# G+ A7 E/ r& T7 [% i( c/ d
& f; N& m) @5 S6 c& W2 L p% ]' J1 E
# ?( r( W3 y b" }; eLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。3 c: l+ c, H% \; A* I
* g( C% H- X6 G: r5 Q$ X2 E) r重启apache生效。 |