今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:% A& ~9 r( E! d6 t
. E5 i& s7 n" w! x* O! i. h/ b+ S! a9 R. ^' s
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, ^: |" q3 C7 q" A3 |9 A0 U
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
; _# v) Z3 o& \0 w# uFatal 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
3 R" d) a( c" C6 G. @3 p; u) ~# Z/ E2 O# J4 p
- _9 q' p2 K! \: F! c! F3 s3 i2 P6 u1 u0 u+ a
6 b5 P5 }' W8 z% \! V1 g+ |- x( V! @
或者报如下类似:
6 r9 z! q$ q5 dWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
! X, {$ |1 _$ r5 c- ?+ j( m- |+ B0 R$ F; i; V7 _% J
出现问题的原因:
5 W. v3 W! P. a" E; w查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
6 i( r: r0 M: d/ `' X r一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
, {6 v' ~0 ?# ]3 n' a) Y1 O9 M6 C' O% l; |
解决方法:
: h) i& h% K1 F2 p- V7 _我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
& J9 [ D* z7 A/ j6 c! L/ ~
& k$ f$ u, M8 N+ A ~" I如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错? i9 X. o+ L1 s( Y5 }
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
, X. g$ w, v3 }6 w9 H! T1 K" H% T( i9 j
一、php.ini 修改方法
$ D+ ~. k0 s+ s9 Z4 x4 N* _3 b把权限作用域由入口文件目录修改为框架根目录" |: N+ m( \" o2 [' n$ `1 o4 |
3 b" p. @9 y! ^- O打开 php.ini 搜索 open_basedir,把; u& s- t8 q- L( H z7 B
( Y5 i' [# H3 n5 d T. q5 ?) r8 U% P9 K" ?( L
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"9 L# l& Y! C9 ?6 M
% S0 Q3 a5 R5 D修改为! B8 \5 U* f; [2 ~# f) V
. |- e* w4 }$ c' m* R
' f$ y+ X7 g) `, uopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
$ l$ I* O5 I9 ^4 W& n; {5 d
# \' J5 f; a6 I; ]) H
7 P: P. E* j k注意:8 ^5 e) x4 `+ R% ?9 _8 i
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
" c: e' U6 m% Q9 W# O" \$ h$ p- a4 H3 Q
二、Apache 修改方法' k+ W1 m7 R3 h) w9 v
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
1 ?5 Q& e3 @3 ~, E0 p' h6 K: r7 {5 A
apache1 l, D6 S Y$ t# N2 `8 ^
├─vhost
4 V% V% d: S Y5 I3 r& }, x O├─www.thinkphp.cn.conf
0 H! W+ F! T3 V├─......
; l" k, C# V. r* b: D$ ^├─httpd.conf" Y3 n0 X# l0 i2 x( ^( H* ^! m
" c/ b( v( w! w$ o# U8 n. N' Y9 A
2 y: ^/ T$ n3 }打开 你的域名.conf 文件 搜索 open_basedir,把+ ~, m3 D5 U4 Z* [. u8 z
& i. P) O; C+ N2 m1 n, L3 S R
/ X9 I& ~8 o1 o
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
9 w: p0 [; w0 N9 E" ^8 w
" {8 b# W4 E) t5 @/ S; ?修改为* g( K( n6 l8 ]+ {* l: z
9 a* R6 M/ l- n% X1 Y8 Y, _' k
" [- ]+ G, m/ N6 xphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"+ D0 k( p: Q' q5 L2 W0 {
1 Q7 a9 E4 K$ z
$ v) }7 h _! K- y# h. h
然后重新启动 apache 即可生效
7 f7 w% H5 f- O+ l, m" N' z; Q> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置9 ]. L3 x9 t2 g7 s2 W& o
" I3 H. r5 J/ n& a
三、Nginx/Tengine 修改方法, a+ A1 ^& l8 s
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
, \) j Q/ U5 b7 I" r9 [% l, E9 J% ^7 A) z6 y4 B0 [+ N* V5 O
nginx6 U0 A) Q: D( x& G1 T3 c9 k
├─conf5 _* n) {* B6 y& g% |4 g$ n
├─vhost: m* {3 N3 i. ?* r/ s+ |
├─www.thinkphp.cn.conf
& f2 m5 ^4 _" v: x6 a& l/ g+ }! ^├─nginx.conf
6 z4 v. u# @. Z) k, l4 S/ y├─......
3 K9 w/ i( Q4 ]1 W$ A- a7 n├─nginx.conf5 x8 r8 O* g$ s$ H8 C8 G
: ]6 L% Y$ ?7 d) v7 a, ^
; f2 ~2 W6 X3 |: |- }: q6 B打开 你的域名.conf 文件 搜索 open_basedir,把" e: U5 Z. h0 Z' J" L n+ R
! h3 ?3 ], |* w9 k3 L5 C8 Y& ]
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";" g' R6 e- e$ g& M# ?. [. x' w! S
* ?" c9 @$ G7 P3 c F1 }修改为
2 i# u- V) {4 N) z' z3 y7 \. p4 V1 [8 A* O
" {1 U: y7 w& U, h6 n2 Mfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";/ t% n1 H% f* [4 k3 ]8 k, e5 r
) I% k7 z& z" U) F' G9 W
* b9 t5 T; R5 b! E9 }, O1 ]+ [
然后重新启动 Nginx 即可生效( c1 O7 f" L% s
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置: t" X( e( V9 `; L" v* j
/ ?9 z. C% p! c3 H1 K3 U$ e
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):- n- z b& W( W4 |+ o u9 h+ R
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
3 s- w& R: [1 R7 z上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;. S$ o1 z, d& x0 E4 L0 h. Z' g
依然会生成错误的配置如下:& u Y; N* [1 `4 e6 e9 x5 G' f
- J' b# Z! d; f1 I* |2 S T
# N% ~, F- c5 k0 n; Y! g; _fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
- q2 U" ^( X3 p: E1 i, e4 C: R- ?3 P9 s# c0 T2 v4 O2 u
, o! f% ~. u" {! M
四、fpm/fastcgi user.ini 修改方法4 g) i3 S5 @; T# | l% q
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
) S7 E1 d1 W& C6 `1 _$ u3 m' ~: d( D
" y! M, r3 ^, s
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
( k! b2 m5 d( e* a8 X- T) D/ {; P- A4 S" Z K
修改为
5 t! k) e) [- ~" n' e6 M X: \ l9 s1 s: X/ e. d* w, P% N! }
* ^: y L; ]& o# M$ j. p
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
; Z1 m; q% j: ?" d5 J% ?/ Z& z6 Y# f& ]9 M. T6 ?' t% K% V- F3 j/ ]
9 c# r0 i9 t) y" }( P
然后重新启动 web 服务器 即可生效!
9 }4 B& ^/ L, K! V; o* R I
$ h) M: E% A1 v总结:
. f* A* _) q( Q7 J3 P, y6 {' V2 Q一定要仔细读此篇文章,否则你会选错适合你的方法。2 z! p! `4 b9 r: I5 r& z
一定要根据自己的服务器环境来选择你的修改方法。
0 q, m1 ^) w" O9 x2 j5 D A/ g. D3 }5 y# J" S% B: h2 _% S: U! t q
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
: C' l( _: _. b
9 \3 k$ p o( p; Y) a" A* h* F# ?% _" ~: N
4 y' U. {3 n- j最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。: u& m2 }; b# R8 Q
宝塔面板出现“open_basedir restriction in effect. ”的解决方法" w3 Q2 a7 s1 T* q4 k- J
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
3 [6 j! i1 o# O) w2 y2、必须重启PHP;9 L5 Q$ H5 I+ h- G* ]
% g# s; v, _8 |+ B- _$ o& R v, h- ~( Q! o2 o$ J* V+ V+ I" w8 }
0 W1 i) S- L" o2 E2 A* d" o p9 l A2 W6 I
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法* d9 W' G" J* s) Q$ y3 v# E7 b
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
5 }" y1 _$ t+ B; k3 \% f' m! Q& c* R6 F
我的解决方法其实和文章也差不多,原理都是一样的:6 ^8 o' T9 M; _8 D. ~( |) f( p4 v3 p
1 u( K. N% t4 L我是看到LNMP官方提供的“防跨目录设置”方法,如下:# V( b0 }5 @; [9 Z3 H. C
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置: s8 O% H7 ?/ r1 {: O' S
4 u: b5 K; d; P
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。: g0 @3 r/ a3 X; P6 Y. m; q
; z# B/ _$ d) I1 E2 i9 y
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
, P9 I5 @7 l* _. N可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。# f# P' o' P$ k! {/ n" ]; H N
删除的话rm -f /网站目录/.user.ini 就可以。/ P! d6 R0 a! M# e' _
修改完成后再执行:chattr +i /网站目录/.user.ini
( j5 h, V* q& u' I; `2 S# ^" M A7 f.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
" W8 w' v) N$ z" q如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!$ ]+ l4 l, m$ S" v5 e8 z
' j: D/ ^3 P4 @3 \# Y: uLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
2 H8 [0 n- w5 S/ S9 P A8 S6 `% x
. ^: x1 i# b0 f! G. i$ M6 sLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
1 }9 ~/ [- }7 j7 D在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。" m& O% E8 N, J: K
% P g1 n" E I+ U* f
! W" T) U( i5 f6 H8 F8 q* ^/ z5 l0 B! ~8 X" s
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。; L& p: ^" C9 Z3 \
i, r q4 `7 }重启apache生效。 |