今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
8 V' u& K# ]9 o
3 Y" u/ m* e1 M+ b$ `, }5 j+ R, m d) ^" K( g& y! ?
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' @ U7 R* ^. E& q. 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! D) B" ]! r0 L0 r+ T2 h/ s
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 G- Y; t& O( U( l, O4 r+ r
* T6 n( l; `$ u; s8 g( W
- V" v- _0 Y" m2 E3 B1 ~6 r
" K/ y) x& d; k8 g: [7 O, n/ u9 u5 y1 u9 O( ?' F1 |7 U; }, q+ ~
5 H1 ~) }0 ?% G4 X x( b e或者报如下类似:5 {5 c# z' Z/ |4 s5 X# r
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):0 f; m7 E9 ], C2 \+ h% m
% x: ?* T9 V& d8 u4 I
出现问题的原因:
# d! q5 o& h2 j( N; y查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;- V9 V# L C; |0 o
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!9 f% i) d& W: E& P. I3 `
% N2 v+ C' j: p( w* r, @
解决方法:
* J2 L1 R; p6 P; O+ q( g我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。7 P: o8 ~4 o+ X2 n
* ^) ]4 V) k$ u% p
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?, G# O" u- t" L$ |& |0 P
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。) m$ d. m1 r; r, }& k
$ \! N& M3 W4 V+ j+ b3 s
一、php.ini 修改方法
0 T4 Q Z) E6 K8 `* O7 B4 A2 O6 X把权限作用域由入口文件目录修改为框架根目录
% c) W* u. i7 ? \! b; U6 C- D
) j( b% F/ h {2 ]) V3 v* E打开 php.ini 搜索 open_basedir,把* t; r5 }# b9 z: [2 f
. o. [3 n" a& A# l8 m* d( L/ s- ^# N
2 V* y# e( H& l* g3 S1 ]open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"8 l! x, X0 P* Z
8 m2 D- \ L; g! J& L
修改为0 S7 t! l% V4 O% ^+ o& G
/ G7 v& g# R0 H; I" A0 Q: s3 f' y( z
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
& Q/ @( }( |0 {
2 f: b* d( O6 r1 W3 w9 e; `! s# V3 g: p ?" n8 Q
注意:
& C# T( v. V4 ^( {6 ?/ {如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
3 F+ Q7 z# }$ v- m3 K8 H# z0 Q8 w; H e' k4 |8 R; @
二、Apache 修改方法2 J) y' b4 ~/ I% v( [
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
" @) G" ~! a& H; D; r
9 g: e7 Q: g, ^/ o! X2 ]apache3 M3 C5 ?# k7 F- D/ V
├─vhost; _1 q/ ~0 N% G3 ?4 \
├─www.thinkphp.cn.conf& ], d z: B) ] y7 C9 X
├─......1 c+ m/ `$ R' h
├─httpd.conf
( U, Z" O0 z: ^5 h% }, }0 f) |% g: p- Z
/ g( {/ K4 R8 r' g3 X打开 你的域名.conf 文件 搜索 open_basedir,把) {# G. [- x9 X3 S( U2 `8 ?
( ~0 R* A( X4 u& K) c/ _8 _) ]0 j& X" U! y2 c; _; j
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
3 r( X( O9 P1 R1 T* Z/ M; M. {3 l1 e, S5 g8 R9 Z) U/ z# X
修改为
+ |( k4 V0 @, f! [+ w( v' K1 `/ E$ ~+ t; G
4 y. m7 r/ o# s5 Q
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/", h; R% g4 i/ T+ {9 j
2 e* {' z Q0 h& v
; N/ `/ f. |. U; B/ U) _8 Z/ Q然后重新启动 apache 即可生效
( ?" r* L; M( B% b( G9 b9 s& Y> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
/ S: c2 J ]7 Y
: M0 b6 g S) A, l. [6 T2 m三、Nginx/Tengine 修改方法
1 x+ c* _3 [$ @3 ]3 |Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件; f9 W0 J4 y7 ^7 W" n$ ~" d
& m9 Q/ n7 x3 mnginx
7 X# L) j4 r& J" W b. d5 K├─conf
( `- s2 {4 d! ~% P├─vhost
, {) L8 k" B& G9 o6 ?/ T├─www.thinkphp.cn.conf
' ^' ^; q6 |! c$ Y├─nginx.conf4 b R; N0 y+ e& }% Q. E ]
├─......
0 G$ ^2 _& {* I4 Y6 }├─nginx.conf" j3 v9 D9 P% E# I$ Z( Q; |
; R9 d% O4 N5 ~+ a" O7 W. a9 W
' o7 r P ` W& e0 u" A1 D打开 你的域名.conf 文件 搜索 open_basedir,把
, \& D, P& _. `4 {: c$ f; c1 g( @) ^/ S5 G# ~2 i; R9 l7 q# I
8 E& q* W; c& W& J* dfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";& i% h1 N8 d! F! @
3 f& U8 V+ _1 }# T* L修改为
" A0 N: i- T3 }3 j! [
, y6 {% e! @2 i2 E' K2 x7 X. y
' v% M" A. j1 ]/ Zfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
5 H2 ^. y& h- j8 C7 u, r
4 J+ i$ o' b$ d* G: {4 y* a7 M5 q" t4 r0 g8 j$ t
然后重新启动 Nginx 即可生效/ Y |( @' d- K$ p! ?& W
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
2 m" V# z; u$ {, |- Z: h. `' c8 W8 n6 \
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
$ B2 C& V5 I" n+ f0 W3 Cfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";( U( K; P4 p6 L5 X, b3 k5 f' ?
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
( h5 `2 f9 k! p( S2 g3 g依然会生成错误的配置如下:- `# N/ }( H7 J g9 y
9 _& t; W, L1 k4 Q3 G0 Z: ]
# P6 \+ a6 }6 e. L7 G0 n- m1 Tfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";% F5 P# d7 J, g/ N8 f
$ ~6 @! Q6 e. [- C `4 p
3 z6 r/ R+ R3 J$ E% }; L四、fpm/fastcgi user.ini 修改方法
: B d) L2 S$ D0 P$ i7 W ^' z打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
' _* W% O( P6 ?! J2 C1 k: H) g% A9 V+ C4 z8 r1 B+ I- L- Q, c& M: _3 D
3 m* E* L2 s4 \, Lopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/0 o6 Q/ k$ k2 u
1 }; w0 S" n. u0 T c4 z) S+ @
修改为: Q4 V3 j% S4 z `
# K2 u- c& o8 k" I# ^* i$ i$ z- d0 d$ ]8 b8 W! W+ c
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
2 a& o' m( k+ Z# o' M
8 G1 i* X8 P' ?" v, X0 c3 P6 K8 G0 v
% n/ z1 v2 w% g3 R0 `. g, B/ A; \然后重新启动 web 服务器 即可生效!
. _( a3 e; P W# G. c! S3 A" G/ l$ _' ^" S9 c, r' L6 P2 Q
总结:% }4 G' v/ d6 n6 b
一定要仔细读此篇文章,否则你会选错适合你的方法。7 T H! w2 [+ \6 f; _2 e& Q
一定要根据自己的服务器环境来选择你的修改方法。
2 R" g$ Q* i; C/ X) J: F* p# y
0 [4 I; I( O7 a: J3 q, _% U9 s由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
) l# L2 g3 \- p2 w6 H9 Y- g* W) ?( ~) p$ w8 J) N. F0 |
; h7 q! j5 J% r# s% W
9 p5 |/ d' l0 j最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。4 e7 P- _8 R3 D% L7 o, l: u$ B1 x* P
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2 e' w7 |7 ?: X+ ^% r+ r1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!1 k2 C% N% q" p$ e0 F W9 ^! I
2、必须重启PHP;
- d; m! x+ [9 \* w
- X% F+ I7 f6 u$ v1 S; ?+ A3 L. {$ w; D5 F( Z; ?& V
: z H: s% R& r: ^$ O& f U' G. r
# B9 n$ z. Y( x7 z e5 z$ x; T, ]LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法6 P0 A; r2 i0 V
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;# t. ]8 \7 R" {8 o C" Q0 I
2 K9 n$ H' ]3 i$ b; t# b" v
我的解决方法其实和文章也差不多,原理都是一样的:
% G7 m- `3 E2 i: F7 b; L5 K% v8 L# c3 D# e( p) D
我是看到LNMP官方提供的“防跨目录设置”方法,如下:# D! O, X/ W1 [
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
) c( r* ^ A+ ?8 `# f$ G: t: I' l/ a, p5 X3 Y2 t/ c/ B; u* q4 ~
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。! p2 W0 S( T$ f- a7 X0 x* ~1 v
1 E% Z+ w& g$ T9 @; k0 L
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini7 g1 A& _1 X6 G3 _. I2 f
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。6 d0 K, `/ e3 `' Y* @8 \
删除的话rm -f /网站目录/.user.ini 就可以。% {& n+ G. ~4 v& @ p1 ~) x
修改完成后再执行:chattr +i /网站目录/.user.ini
: ~$ q3 H7 |0 C+ p% R# R.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。" ?* P1 p3 J5 t8 C; F
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!" m6 e* ~6 ?( N! j
: T# `5 f; ^' @! m- a. }
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
# M4 h* R. ^8 M
/ {, ^! E; Q8 j+ c5 lLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。' l: N. [. J/ l
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
( V3 T8 @' ^" M8 a2 {( j; j* L' J' j8 G' r1 o
4 E$ W( F6 O6 h% l z
& v# F2 u" f6 lLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
$ W& U( ?/ J5 g5 |6 |! O! d
9 b% S. [2 J( Z# |' J8 B; K) t) N重启apache生效。 |