今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
; o+ P+ K0 a6 A$ Z! \, {) j, t b4 c0 F7 `/ o8 `* W: }$ K
& d( m' A/ @; X) ^: e
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
, Z3 \8 s8 V5 [3 K3 @& HWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20% A: ~3 r" e" _
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 205 K, I2 r- Y6 M' {
. Y* a( @+ l- ^
$ z8 E" k4 H- @( f: K/ S
6 {. ^, w* p" j4 ~7 W/ m u
! j0 T4 t& ]9 X" `0 E
; ~+ |% U( u- a或者报如下类似:& S# P0 n- x2 q0 ]: \
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):! W3 W# C: C* S% l! ^7 q; @
3 v+ M7 N$ r3 B: r( n" a
出现问题的原因:
+ W3 M/ r! X: Y, y/ j查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;2 k8 b- Y, O- [1 _
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!# Z! u, t0 _! y
. h9 \" \8 q6 {0 _解决方法:. ~( p2 c `* j, R! @) Y5 k
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
" n# \8 w; ?" @* v/ [3 I# G+ P* [, j5 J X0 R0 |; w
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
3 t1 K R: P; P( Q7 v! B% `打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。9 Y3 q: T `0 ` P) N8 i
8 A1 z& E5 r+ N) F8 d' F, \# `2 }
一、php.ini 修改方法! d5 J1 k% E$ q1 E% e/ |& c
把权限作用域由入口文件目录修改为框架根目录7 J' N/ W; w8 o: b9 p
$ X7 ^. N1 z0 M! t/ Y" X2 E
打开 php.ini 搜索 open_basedir,把
! O; Y" s; G O" E: K1 q- Z- U b* _3 V# j( i% y6 V- M
9 Q$ E6 d" |, B
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
# {5 F7 p9 u- C" U; X, f9 @
3 t3 R9 l7 { w- t0 t修改为
k2 W1 X! U" X) m0 Q# h
/ A7 u( P1 R- f( H( I1 e; o' R) f7 O: j$ q2 g6 g" S c
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
0 u$ ~: U" ^; j# W! B/ F: Y/ c0 j$ g& T2 f: e1 r& G# a
$ ~! [$ G C0 f/ d+ l0 u t5 O注意:6 r; H3 d: _5 I
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。5 a1 l4 W: w5 P: K' l
$ w7 J# Z/ c$ B9 f3 f) v, n7 ~3 a二、Apache 修改方法7 Z& e8 C8 }/ o3 _" ?
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
g- o+ \+ t/ @+ Z0 J, m
$ f+ v+ s) n' q! |apache; ?' }8 Y9 h" h. o
├─vhost
3 |1 s1 g. C8 K4 |, Y8 u├─www.thinkphp.cn.conf) L4 Y0 |7 l5 U9 T. H4 X
├─......( |1 {% r, `; D: R4 A
├─httpd.conf. L; W" e5 X- D- i2 R
& M l" B. a! ?- U6 f: i" n
/ D& t% k0 _$ n$ }
打开 你的域名.conf 文件 搜索 open_basedir,把
' w9 Z- P4 ~+ D/ `% U4 y& n# k( ?. g
* Q# D1 A0 v/ Y. Jphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"4 X y- P0 F3 n1 X- ]7 Q* {9 ]
; _1 c" w' k- o% L; I5 B修改为
/ G! {/ j1 ~3 L) `, W$ k7 }: ]8 V3 T2 v* c, c! Q: h2 n
, ~+ z. [8 _1 x4 \3 k; C
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"9 s% U9 O8 g: ]( ^. ?
( Z' O! G* N {8 T3 X6 o W
- d5 Q! s2 V+ J3 C) }
然后重新启动 apache 即可生效$ J- f7 t; o+ w% h# Y% s
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置; M' i" A* f, I8 A- h
. @7 B6 S5 {' l% [1 K6 h- [+ f* C三、Nginx/Tengine 修改方法
. y; ~& {* R" g. A, g" INginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件- `" ~1 N. o( d) `/ `) f
. h$ D1 y5 C. W( E
nginx* V1 Q" t3 k% h$ O% a
├─conf1 f0 s0 H% N) f% N8 T8 w5 t* B+ o
├─vhost" L) G4 M5 K) ^( v' z9 \, }- |% ]1 B
├─www.thinkphp.cn.conf" L3 u6 h3 E3 q3 d1 C
├─nginx.conf
U8 e2 T' k P0 Z├─......
8 m) C& r: K* {# V9 f7 ^; x" ~$ H├─nginx.conf( c, W ], ^& ^) w- }$ {
2 [$ w, p5 J' I6 J
% C, q( s! p; b/ V( F: h! K打开 你的域名.conf 文件 搜索 open_basedir,把
3 m8 V# \" h, s* c. O
: Z6 V3 M. ^; }
j7 v% N. s5 M+ ]+ C9 k qfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";1 r1 J( ]6 y: V0 P* T1 E
) S; \7 d) k: t修改为
/ v# D! {0 u3 P2 S' H
8 a) h6 b& f2 f0 ?5 ^6 `' u
, D- B3 q& b2 { U4 }: m6 lfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
/ e7 \- h* H0 F: o) ]/ J4 l( K* i F' Z" b
6 W. x; @/ Z1 J% O% a1 v, |; p" J然后重新启动 Nginx 即可生效" L" M( [! s0 D$ [
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
U3 g3 T6 Y" `: |! G- b2 N
" p8 S* X- F( i- q4 X$ [7 ]注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
5 [* L" l; A4 ^1 V# C* t" }# Efastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
* M. x# L) D; h: t# K2 p. p上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;7 G; ^6 z8 G! b# Y( g: c1 {
依然会生成错误的配置如下:$ V1 }+ ~. V( c1 m
' O2 P4 E/ U% q* U8 @/ l: l+ E- h
! K+ V3 G2 W4 G) i w9 g) Z* V
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
5 q, D N6 @7 J1 b# M$ ]0 s r$ p5 s5 Y x7 Y; b, w/ _, K
]2 \- d7 y' X! y3 q* d四、fpm/fastcgi user.ini 修改方法5 i* H$ N0 R2 a) {' w* @& b
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把1 ?5 S2 H6 Q# O! G! \
0 s" H C: Q' [$ {
" w2 E- W3 P1 }0 O9 Iopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
. M) t. p/ G) Z+ } C- e; a
1 G$ A+ B# [1 A修改为
5 ]! x. m; S3 u5 J
# g) s. E, E n& ^/ I5 M2 e9 j0 b x x8 s
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/ h9 u, o8 a* T: A9 q! d
" H D& O0 Q& ~8 i8 B: d) u; W; ?) X5 x, l$ [
然后重新启动 web 服务器 即可生效!) e( Z( s& c' {! Q8 `
% M+ E- ]5 E {
总结:
9 y/ h: P* h A1 N& Z8 {1 c一定要仔细读此篇文章,否则你会选错适合你的方法。' N% e# O& k0 u7 o
一定要根据自己的服务器环境来选择你的修改方法。
* _7 n! t. i* m
9 e: E0 e9 a" \2 m# B# Z5 O由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!) _) d" }0 e: A% h) ~- j
8 q0 u+ |5 G$ t2 _9 c" n, G3 i+ C ]* w/ T
8 r! I7 o% Q! m5 d1 H
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
) w) r9 x( R4 a宝塔面板出现“open_basedir restriction in effect. ”的解决方法# s& {8 f/ C2 j4 j7 X) _: c. |
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
/ g4 A2 }! _3 O3 M5 z2、必须重启PHP;
9 T' y! }% c+ k5 _9 m' Q+ c1 y: F8 ] J- v
- ?( t, k/ ?8 o6 o
' r- j3 r' S3 a9 Y. k6 q1 Q/ O7 C. ~. ?7 T% e5 J8 F" @
LNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
/ [6 W3 k: z! a5 E我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;7 R+ Z" F5 w/ x. T+ t
% V9 l6 c6 w7 q+ N8 Q, a: j: i
我的解决方法其实和文章也差不多,原理都是一样的:3 v# W3 p/ _/ G' ~8 G" i3 J, @( _
! m% g3 `4 O: z
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
2 S# ]% ~ k+ D$ @1 Z' z, BLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置) _' T! w4 t6 v7 [5 m& Y3 r2 N! h
" j( x0 c0 F! Q8 A) tLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。: i+ Z7 G. K4 g/ L
4 \% q# t. O! x$ A, M0 D
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini4 r" l7 z% ?* R1 D' X8 H2 p# @
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
4 R. S0 u. |' ]1 _删除的话rm -f /网站目录/.user.ini 就可以。0 n6 `5 n7 @* p% H0 ~. ~- }- R
修改完成后再执行:chattr +i /网站目录/.user.ini/ f- [7 R' |+ r9 Q1 j" X
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。* X; f2 [0 r5 G- j- R6 s% }3 d
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
* W+ H% ?7 p$ l2 n3 t t# ~: r0 I/ m- R' c9 o# a
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。' V8 J) ]( i, w4 V
: E6 \; J5 d6 p" sLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
2 l$ X. u V" O/ U2 [在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
4 z: X B$ l, v" D4 y/ E1 J, Z/ s3 T& I9 a
' Y( s, [5 d& v7 X) E9 f
/ X% ?* z* H2 x; uLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
" @1 O7 U" t) d/ X4 h
A# K4 b3 T/ C- _1 Y重启apache生效。 |