今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
( _ ]1 Z' K4 {5 ]& y( _
& u2 Q o% ]0 b; W. v/ O+ \6 N+ X* {7 W% x* t; 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* I, G% m! K) i8 {
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
/ X, u9 ^( k2 r- T9 N3 d: g' A9 P$ vFatal 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
/ k/ s3 x! k5 ]6 w, [& c
* z( ^0 \3 K7 ]" ^. w( v5 p; ]3 q; _4 N+ ?3 R2 {& l; `
# L; d c8 O, }
* B7 b2 h$ H! }1 ?3 K8 h# r5 o7 n& ^5 [$ n3 H) y: I
或者报如下类似:
; i/ W8 e, m' P" ]" z' M5 iWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):' x7 s" h$ T; `2 R
; O% Q; c5 K# H+ G
出现问题的原因:
! w5 @: p$ u+ T4 f3 e- C% }& F9 L( h查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;2 S+ q+ P3 ~. u5 v$ r2 w0 F
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!: V0 r9 `/ B5 Q) B2 T F
5 l+ ? o+ k" q/ S+ L0 A
解决方法:+ v* C0 ~5 r% F! ]) @, ~3 H
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。; a% I) M' ? ]3 H
1 s; _' N' m7 Y; _( _如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
( \/ @' g/ N1 W1 e+ [/ O打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。0 r b8 c! F9 S9 R& s9 F% h
7 V3 j' c9 n: S, c$ L* Z' f
一、php.ini 修改方法: k- f T# P( B- n# p3 T
把权限作用域由入口文件目录修改为框架根目录4 D X j! w- @9 h" B5 q! \
$ J/ W; h" Y- m& N" p. t( f
打开 php.ini 搜索 open_basedir,把
s( z" e3 E g0 B7 F6 F5 ]2 Y7 l# W$ t9 H
7 r# v& J; n% N. A& c) J# ^5 i
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
& W& Z- r2 x% {6 x1 n( D) \
6 s3 d+ }. c/ c7 n3 w2 p! x( D5 X修改为5 O6 E' c+ T% s. T% \
2 D+ z/ ]0 `* c" }
. H6 l: M' |* [5 a' H
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"& A8 Q, e, U7 B6 V& E& l
/ y: V, S1 O# ?5 ]8 E6 t4 p) p7 g) d
注意:
- S7 X- g# v% `如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
- h7 C1 a+ F* o2 P. @
+ n2 k% O) d) K% ~二、Apache 修改方法3 s9 u$ j/ k9 V2 c) |# C) h( H1 _
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件0 S9 H- r9 G* U
* Z% J6 |6 y5 N# Y6 v- k Mapache6 L& l" n+ ~, l% s/ O
├─vhost3 ~3 W5 m5 M$ M5 V
├─www.thinkphp.cn.conf: Q6 v& i6 E X1 d) n
├─......+ r% d$ [6 H% D6 p7 n3 k9 j% K) I) Z, p
├─httpd.conf: `1 ~! r$ o7 S0 L9 [
: v4 v7 B) N+ P
3 z! r& E7 R1 Q0 B6 z8 \打开 你的域名.conf 文件 搜索 open_basedir,把2 S, L7 t D3 C9 R, n2 z, L
- }# v8 p: L* ?0 k8 t% G$ {2 o, q
/ S1 y7 y" a& N4 n! P
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"& w% w6 B, m7 A. n& n' ^
9 r, K- m2 t4 G+ V5 V% O修改为% N1 d- s. \# K K _( C. [
9 o/ X9 s+ S2 g7 Q+ a8 j4 @+ S1 B1 `
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"* k% q4 l: H$ {
' ] j a) ^8 d7 k N x) V( B4 ]8 ]
- ]8 x: z% J. U( a1 U$ g% \% u! ]然后重新启动 apache 即可生效- m I. k% U8 R$ c; ]
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
: T% q) e1 \6 j5 l2 P# d, `, b$ v( D U) D) x" s A
三、Nginx/Tengine 修改方法
4 u* H9 K9 k1 A& H- HNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件. k" _/ V3 h' L4 u ^# f
# n9 j' A/ X" t; X* C$ d+ Mnginx
1 H8 y6 W/ R; l- \; u+ [├─conf
8 o3 Q Z6 x s├─vhost
9 }) {8 O7 ]: v2 Y5 ?+ X├─www.thinkphp.cn.conf
, P; b9 ^+ _' c, c7 b├─nginx.conf
2 x6 L k A7 i. c: O├─......8 p# T5 b! p: Z
├─nginx.conf Q) ]' s1 S( d6 ^
8 ]/ X8 L! l2 J, y
2 {+ r# Q9 `# c打开 你的域名.conf 文件 搜索 open_basedir,把
! x7 J4 z6 O% V# Q! M; g' h+ J: Y. x( A6 Q/ ~' e- ~8 M" L5 X; ]
6 ~' r! L/ g2 k1 tfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
! @! l1 z- D. H: |. D- r3 P; } m; s" L2 W/ g
修改为
* |# m v7 G, z$ Q, d- P
6 r( [) `! v4 u% Y% ~( F
" e/ M: q" @. }# J' Ifastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
/ P0 c2 y7 i' i0 T/ m6 V( ?$ }2 l y$ P
( G" C$ D! T7 {& o7 V# _
然后重新启动 Nginx 即可生效
$ D% q$ H2 A$ u4 Q. o% d% e/ V域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置- x6 W+ M8 N' ^& [8 X
9 p' h, `1 G8 z# U0 J) I# g1 u
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):4 i E1 T5 g+ E; W) X
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";+ b, W$ V2 {* `, \: ~
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
) G. q8 D6 f3 v4 M6 P$ t/ @3 j依然会生成错误的配置如下:) v* h; \+ I4 ~/ j; G
" c O! c( `$ O6 B( Y' G* h
5 _ {) y$ m! {4 L9 b' h7 M$ _fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
4 W: P& L9 ?# M' g, [3 h) f; ~1 X) n9 u2 h+ _. Y, h* \* W9 x- b3 L5 V. y" Z
* W/ m/ `) ^3 z. A: P
四、fpm/fastcgi user.ini 修改方法8 m: g( y& o1 b ?/ @4 A+ h& v1 j
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把2 o& y. o. ~$ A$ a7 Q9 X
- {. @* ]9 F# Y7 u
; p3 w" ~+ x7 V6 w6 s8 ^open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
' u; B5 u" p1 i& p0 i* y* K
}/ y6 l9 ]6 l% C: z修改为1 Z2 |' K1 L& Q% i$ A0 E- c/ L1 V: Y
# }% h3 n" L1 _" Q/ z( }
% }6 m! E. i* ?* n* `4 nopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
7 S8 ?# P$ t4 {& h5 ~5 s- q: G6 F5 i y1 ~4 E
% y# v4 U( a& `+ q7 }
然后重新启动 web 服务器 即可生效!
3 _5 g' p( t" m, R5 h' F+ b2 h: u$ @, `7 k6 j
总结:
M$ Q" V( G3 H5 }一定要仔细读此篇文章,否则你会选错适合你的方法。* Y8 D# n, l& D0 ^% m
一定要根据自己的服务器环境来选择你的修改方法。5 H3 \2 U) N; j7 k
( l2 C4 L* {$ v( k( I6 C由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
& [9 c3 F7 e# X! K% W0 H( f" R7 w) b
, s) |4 Z6 P' X. T6 j/ D+ k9 l. c. K* g) w9 g) I/ ]' @) w; A
7 E6 k& p( z0 u3 e最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。5 A( R" M# h' o/ H
宝塔面板出现“open_basedir restriction in effect. ”的解决方法# D) ?; |: |; [" A; I* k1 f
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
3 e( I& r6 a. H% a& b7 g2、必须重启PHP;7 a+ U2 w$ e7 ^# L1 S3 h S
0 b, \1 S' @9 @+ t1 M0 N/ W
. b; p, X! c2 l- u, W5 T( g
+ ?$ n+ [* T+ q- Q, ~
' p7 y r4 x1 u: ] rLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
1 A+ d! S8 t$ M' `! \% T我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
( V1 h( p9 N, j5 d" Y0 _7 r5 O! v1 ?" Q. g
我的解决方法其实和文章也差不多,原理都是一样的:! f- r& h; f8 O6 k2 L: z
* ?' C6 T5 q y: n) d& _7 b/ K. S我是看到LNMP官方提供的“防跨目录设置”方法,如下:! v1 Z' l) g! L7 P6 x
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
9 L9 e# y& |3 b$ a* `, }
9 X k8 a. B* S5 v9 l% p) [5 kLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。; o) T3 I6 ?" @- M
7 i- w) _) G; j
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
+ ~+ R/ k' ?; n* F) k6 L" e可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
+ g0 W7 i( v- P7 I \/ |4 r4 C删除的话rm -f /网站目录/.user.ini 就可以。6 k" ^2 O1 D# B( n- N
修改完成后再执行:chattr +i /网站目录/.user.ini
! C' Z3 o3 q" M3 X( m.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
0 W8 F" \4 C1 z. B3 u如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
; [% L; [, t2 k/ y# J! O2 A4 G J( }0 ]+ w- i8 L0 d
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
: d* O/ Y6 T% d' K6 K) w
|. D+ }. K ^6 H" `LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。4 K$ X$ O% W1 P' g
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
( a- H2 m& {+ K2 B$ G/ H3 ]# U4 P. w# r/ v6 w5 n
- j5 h. N7 _$ J1 x5 m
+ F* E$ I+ i9 e! O1 CLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。6 ~6 w) z; O1 Y5 |# X, m/ Y
% U' b( s7 {; n) e- J/ s+ E重启apache生效。 |