今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
) r9 W+ U0 V/ d& U ?. u
t9 K- D3 j, c5 }8 l2 ~ f, A. F5 q% q1 G) Q. Y/ ~4 B
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/ m) R4 ~' T0 p$ `
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/ y/ ?1 F: x+ H1 K- ?# d
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 207 }4 Z" R% Q" Z) d/ h; P
" q1 |! F( X9 E* L( l3 d+ z
& l& m' o# k+ p1 B4 T1 b
P4 z" L: d1 E- @$ ]$ `
) D, B: h8 Z. x0 |7 x M: C4 u) b
: e8 Y0 @( p% Y- @
或者报如下类似:) I7 P8 l: c3 }7 a. o0 }. A
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):/ ^; T( m6 r8 }
4 B- o: i, ] a5 Z
出现问题的原因:
. P; U1 p8 E# ^! w& f( w& `查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;2 E% o8 _6 E+ Z) N% M k
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
* q6 a2 e$ |0 O! E, w; g! U% A6 z6 U# D/ }4 h+ M
解决方法:
6 J- ]8 P6 M! S% p. B0 G$ {4 d/ [我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
2 m) f7 h0 p+ R) f2 `" |+ Q$ ?' G }& [! Q: f1 }2 J
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?' U/ I5 {8 h6 _( u
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
. M M- L7 G1 ] C! Y" n- U3 l" b- B1 h9 _6 C
一、php.ini 修改方法$ z* J6 a9 j1 E2 o. A* ^
把权限作用域由入口文件目录修改为框架根目录0 {2 V) d2 k L: A8 M
3 B) _6 h8 Z1 Z. ^. ^打开 php.ini 搜索 open_basedir,把2 K! ?* W9 M" A, L% X' v K! k
6 V. r4 f, j9 q& l! {
* m# p* N, H# I) G
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"! E5 |% N b5 f0 x9 h
6 g1 w6 A ]$ U9 C; M3 ]7 [, Q' W
修改为
: }5 I8 x d. X! d6 d' b2 _1 N0 P! g; P
6 p% [; j. L! S% W7 t6 Bopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
; T+ X/ @9 I9 N8 b& O+ z1 G- I w8 j" u5 d" L
; U8 k) ]2 `7 K$ J+ O- H; D$ r注意:" r, H# a0 l& g* y
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
1 |7 s- i2 {: G* ` h5 P$ p c) K9 e+ R8 _; c6 z
二、Apache 修改方法3 W8 Z' j9 n" ~( ~6 I' [6 z# _+ z* A
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件) j! P7 p2 i% d' S7 {
, N x/ f3 f; b( vapache
l( A9 m9 B% M. J4 n+ }$ J├─vhost* g" s3 o9 A, l& d
├─www.thinkphp.cn.conf2 d& Z8 G: e- V( z7 d/ M- n+ R
├─......# ?. _' V2 w4 p6 m( A2 I9 x
├─httpd.conf4 Q# o: V& o; I% b7 B6 U9 B& y
0 S0 S6 b* f; N. f6 C. o. {
1 Q/ B( u5 r4 e; L: S( Y打开 你的域名.conf 文件 搜索 open_basedir,把" M" H4 F5 o9 i8 T* i% G! [7 W Y
; o+ O" d+ f. `6 n
9 {% d2 L+ \: i* q0 c
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"9 B, G! g; A% k, `
' U; U$ @6 p' f' o
修改为7 w* ~" V% N2 F7 `1 ~
( T( _- e7 D& x, Z2 D
9 j, j( G# O$ l1 Y9 Uphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"! I' _6 K, O8 E% U7 o v1 E
3 f( n; H/ W! M0 X; ?0 b5 ?( w0 W1 y, Q7 ?. N, N
然后重新启动 apache 即可生效0 d, r0 d) V$ G1 R U, u
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置7 d* T3 t! r; J) b, t/ ~ ~# ~
, @: q2 j$ }( u
三、Nginx/Tengine 修改方法9 ]" F2 b' d3 F6 A" W
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
6 G" x1 ]+ w9 y$ K- M b9 L! }8 e7 ^2 [
nginx
" f5 Z2 ]' J) E8 K0 X├─conf
7 X! S1 `8 v1 }/ J" a├─vhost, Z/ d) i. J2 b2 v
├─www.thinkphp.cn.conf
B3 l1 u, h4 O; j├─nginx.conf( Y: N2 Q5 Z0 l
├─......
3 P$ K/ i# F0 R) \" a├─nginx.conf
2 j3 x) j) H( l6 E$ i) a- {5 g+ J" |, P: y8 h" @# _7 F
# L. b" M% s& `5 j' a Z; M
打开 你的域名.conf 文件 搜索 open_basedir,把
) g0 J1 q' [6 H6 f+ M+ a
' x9 P8 g. E8 J) n0 f [. P+ u9 ^# C* \5 d
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/"; b/ y: _- k& |0 U' Q
( T% J" }; V+ A, l修改为
5 x: T% [4 b( F& j
5 F0 z3 k1 ~# r8 t2 ?) V. Q5 a
# o0 n0 Q9 Q5 `% l# Jfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
" W. y+ a' G, Z6 q) m# D& \
) O* y" ~; L* Z* `2 j5 W' i8 ^/ h% k, p2 \5 ]
然后重新启动 Nginx 即可生效
$ ?4 E5 T, |% Z' b5 J- l域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
. R! E$ H7 V2 K3 k- ~7 K6 F1 }- q4 u& Z6 [1 l
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):7 d6 u% C2 F2 I3 S$ \
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
1 f% D* b( N: O y: N4 i1 f) q1 }上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public; H1 ~0 Y( @- r d; n+ Q
依然会生成错误的配置如下:
. j% J+ U) O* O1 f1 e; i8 b
, f6 ]/ p6 U. X8 _, T
+ R. U" f, V0 r6 r/ w5 _! h; jfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";( f6 G8 I! m; @ A
1 G; |- \1 H5 @) g& \% x6 F4 K- @
四、fpm/fastcgi user.ini 修改方法' Q4 h2 Z- S7 e# ]& Y) o
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把$ U8 S* u* Q% L) E7 e
+ E# T' @6 E5 ~' Z9 Q
! |! i, z0 E. H- u1 i9 a
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/" S9 O, ?% Y1 `, }* L4 l
# W% l* L# X, P* S2 N) `修改为# j# q+ T! A2 r$ _8 Y& i' ~. Y
! w% R; q6 n3 W& Y1 x! ^
* f+ L, L7 z7 yopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
& A* S$ G! g5 k f4 F' w
# y+ o5 Y5 K8 N* }7 B# R" z$ L$ W) I0 V3 e2 h
然后重新启动 web 服务器 即可生效!
$ ~8 B( x8 n! i8 z# t# b
& u" q1 B% w; x6 }1 X% ^总结:7 H+ G8 N0 d. }% Z
一定要仔细读此篇文章,否则你会选错适合你的方法。
7 f4 c* y7 W5 ` G3 `一定要根据自己的服务器环境来选择你的修改方法。- m, e; B& _1 b( V
) M- A- Q: R: n8 P: [( j4 Y由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
/ i7 O6 U$ s6 C" e( f
, m. h2 Q3 a8 H7 }; @- n9 l5 O$ W1 w+ I% g
% o7 c; K: V* O. n最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
6 j) F) d9 b8 T! L( c. ?! ]宝塔面板出现“open_basedir restriction in effect. ”的解决方法
& @- {( a2 j1 g. z0 p1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!4 Q- i; i( K: z `
2、必须重启PHP;8 u% k, ~# z( d" O. J5 O8 `+ e
; q2 n/ q7 F r; k
3 G; W' l5 g! d
( s; m5 D: v. R+ _2 P8 S6 y
$ S: I/ |4 g8 Z7 m4 O% ALNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
8 v3 N6 R4 J8 e# |6 t2 A+ q% d我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;) }7 E8 i, H' _5 w! @
9 l2 f3 s- Y5 p% q' @1 x
我的解决方法其实和文章也差不多,原理都是一样的:1 F( {- Y% Z# E4 |$ B: R3 N
$ P3 D$ X: F1 S/ }我是看到LNMP官方提供的“防跨目录设置”方法,如下:
5 o7 k0 h) s9 q j- a' I3 f3 PLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置+ b$ r4 n& {2 g2 u! C4 a
2 e6 B6 ]/ b& Y# ]1 z' h
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。: q7 p9 W$ j7 I3 t. U5 r6 C
& \! Z4 d- W/ E; M) Y.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
5 e N& r- S: N6 D0 s可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
6 M! o l' `& @% o2 P ^删除的话rm -f /网站目录/.user.ini 就可以。, V& d$ d1 T7 J; }* N8 T
修改完成后再执行:chattr +i /网站目录/.user.ini: O- G& n3 V; n
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
: ]( `1 q1 {+ X( Z* q# x Q如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
6 W, O6 u* w7 }2 N* ^3 Z7 k; \& Z, n v6 V
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。" A! ^7 T0 |1 `
" H! k: K1 V3 {% C) u
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。2 [5 i* D' u \
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
8 \, U o5 U7 r3 M
. O$ J9 }$ a l; V# u, c+ H1 B+ R [3 e! x
1 j. I) Q4 ^! Z& k6 r( M- X2 \8 |LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。( O. C$ a- C4 H0 T1 h' Q
, u( Z9 K9 y; g1 h+ X& r" {! l& ~重启apache生效。 |