今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:0 n4 _' M% @$ U2 _ Y
# [% o P1 B$ d3 h, d
2 N7 G. K8 I+ O7 I: ]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+ T [7 \) H1 `' r& H
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 202 l- q4 g" x2 O* e5 F A8 J7 ~
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
! S2 h0 c) a; C) K v( V$ X9 F1 N* ]# O+ t* l: Z0 r) B
6 H' A+ O8 m* f6 A- D* O4 ~
/ \# I6 S* P! E `9 s! v
' {" O. w! \+ ^* A% |
4 W' e1 v. O3 X, R9 w8 w
或者报如下类似:* v4 Y: M l7 H& B. V5 r
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
6 d7 e6 f6 `! T2 N5 |6 H7 i# V
6 y2 ?# O# e" \/ j5 h) r) [0 a出现问题的原因:9 `4 }. t, Z: _& f. h
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
5 \; ^' e" b4 D4 ]& U0 i一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
$ ~" `! T7 X. b5 ?5 u* @, R& Q2 c4 l7 `$ F. n
解决方法:
8 W' B2 s- H& R) {, i5 I我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。$ `3 h9 h) Z" v+ f" {& e- M
2 Z6 A; o3 ~6 o [2 Q2 }4 ^ J
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?2 J# Q0 I2 G7 ~8 v0 u
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。7 F0 I! ]/ q' d1 a
6 P2 Y5 R* r6 m$ l$ O一、php.ini 修改方法
' [5 z4 n) ~0 y, i把权限作用域由入口文件目录修改为框架根目录) w+ R% c2 A; ~( n
1 Y& P j: f5 p+ }; S2 g( T
打开 php.ini 搜索 open_basedir,把
% ?3 A* I0 B a7 [6 P! X* G, R1 l
& h0 l; }8 o- t$ H; f
" D+ M8 U, l( Q& u+ i' ?1 }/ |( s! Dopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"$ N* ~8 z1 s# d9 X: T1 v* s
& J! ]/ p9 o, k0 @: Z. Z. ?修改为
6 A8 i' S$ ]9 s# J6 W- E9 {6 U2 ?) A N3 p
+ p, a+ T( O# u" R! t$ b0 P
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"% N' U) V: h9 Q I0 V5 S R* q$ ^6 v
' v8 n" m' B3 R- v& ?/ G
! N# n2 g9 [! p! T; G+ S. e2 R, \
注意:
: C& y( e, ~7 u* e如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。1 a7 t. s* d# G. n
8 y5 q: w/ {$ [. p5 i5 c" ~3 M% l二、Apache 修改方法! n: j7 V# D7 F' Q, r: K! U
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件8 o- C/ g- r9 M8 R1 U2 R
9 }; C. s: ]' ]* B# b
apache
! |3 G5 Z3 E( q1 C. x3 n8 N3 E├─vhost, D4 O* S) K' x) a1 e* e4 ?
├─www.thinkphp.cn.conf$ C- a" T* L# K) D
├─....... K# A* b! w" Z1 \. r) U& a
├─httpd.conf
' `3 l% I( d- p
3 G4 o- @$ ]' j" E+ N
: I) f# d, i1 S/ p打开 你的域名.conf 文件 搜索 open_basedir,把- ?5 X) r) N5 m7 M$ Z& X6 q+ r
6 W/ x+ t8 |) {2 }9 }7 `
8 A) g9 @; V5 Q) E* L- \- J' Iphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"2 N6 A5 P9 g+ m, b9 W& H- W6 L: [
3 z4 O0 {* ?5 @6 O修改为
; h1 _1 O3 W$ w6 O& Z/ l f& {: n, c7 X/ w9 i Q0 ?
" j$ v' o8 Y" V- B8 @. r6 N6 b$ N+ k
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
9 V& n% a. o/ c Y0 ?
$ w, q8 F, k/ ~5 {' ?/ |% q
: F' P/ u( R' c! v) J8 b然后重新启动 apache 即可生效6 c. Y( E5 X# b, P# P
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置3 o6 F! {( E/ _' z [
3 b8 D8 L" w( Z ]5 E三、Nginx/Tengine 修改方法
. U( g9 y( p5 G% j& }) M; rNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
$ W, z$ } B# i. X( ?
- a; K5 ~4 j+ s; C$ k# Vnginx
S' g7 c5 g5 V; X! Y; N├─conf
3 S+ Y3 i3 `" F' d2 n- D, |. S* e├─vhost
0 c$ w0 [5 B7 i P( r├─www.thinkphp.cn.conf
7 N$ }( Z t. H├─nginx.conf
5 D8 d7 d& a5 d+ m+ p) |├─......
# y; m- I' e1 C├─nginx.conf. k7 d$ n, b5 r3 v
; F/ Q5 V! X) H7 D
3 Z' y* M2 ]8 T- D' C3 ?打开 你的域名.conf 文件 搜索 open_basedir,把* }( h1 [. A% Y. w8 D7 ~+ ]0 E
$ g! U F2 B" r/ `4 l; h2 n0 s _
' [# B" d+ ]9 s5 R f3 G# B
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
Y% R" w0 X$ u" i% N& C9 r+ l; }8 m! |# c
修改为7 O" b R' O2 F. A9 p
$ w5 o* {% @5 _4 c3 q$ p* L+ k
- h9 ?5 s) b' t1 f3 q3 G8 j4 Bfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";9 Q1 o1 T) P3 R6 i
# L! y w1 {7 L2 q
- E4 y* w' ]" |* ^
然后重新启动 Nginx 即可生效. g9 T- N1 B+ v$ D `' g
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置! @( c, E8 j4 C/ x- y3 [
: A. j$ E1 m- \$ o+ _
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):: U6 S* O) J5 f( d
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
' J8 s9 w4 p8 y9 g2 T上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;* \" I0 C5 J" M. T: ]( k
依然会生成错误的配置如下:
; ^/ f8 m2 V; N* N. y% e* T
$ S; \! ]2 }4 L- p) i( s: P% K) C
0 k! L; J8 |3 C6 a+ P- Cfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";, N6 e: P( c% I, t& Q, u! Q
9 O `5 h- W$ K' h2 q. o& x6 j
8 [6 v1 ^: O- t% f四、fpm/fastcgi user.ini 修改方法& n. ]8 o: V- Z4 X# C6 B, H
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
& \ b7 d, p0 ^% X: N- Q- g- n3 J6 \, S* e
% q2 ^6 m j& d% Z) y& `2 F" wopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/% J$ }# \" f" e) G7 `" S
" ]- j% [4 L2 ~& E$ T/ u: Z! @
修改为
' t! \# C0 n3 }9 s4 E, O+ ^ F4 Y( {" M
# k E7 Z8 n/ K
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/. F- o3 d. n5 a: ?5 u/ C( _: t* @* D
7 f% T9 F, F1 r/ l# q# X( D
( g8 P4 n; j; ]0 \0 O3 m6 T U! k然后重新启动 web 服务器 即可生效!
% n w! K# ~' U4 r' F( c5 e3 h2 m1 G: y. y
总结:
: c+ N+ W/ w' P) Q1 ?) m$ Q, f, D I" F一定要仔细读此篇文章,否则你会选错适合你的方法。
8 _/ ^6 E* y& O v( r& n一定要根据自己的服务器环境来选择你的修改方法。4 F8 M5 K2 |) m; @2 s2 U+ K
) |0 W3 H8 e; s. ]& z
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!, C( F2 M8 d, R$ A
5 i5 e& }4 P8 N$ K8 I" Q( K/ t; n0 g' n' }7 b/ _7 k2 H
T% g3 K0 d% B. Z
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
' J4 R9 @6 s) F: e- O宝塔面板出现“open_basedir restriction in effect. ”的解决方法
! o8 U$ ~8 h r1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!2 s G: v _: L% K' A* z/ u
2、必须重启PHP;( i0 O& \, d8 ~' J: W) `3 b
+ b8 p$ _" [/ y7 G+ k
8 J! S$ ]# N/ v6 Q; m: Q0 _( i8 M/ x9 I
: _3 K% E! ^4 zLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法1 C+ o1 J! K) h7 P) o6 z
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
4 q+ x" G% F/ d* l- O! z5 T h! W# Z1 b! O# A
我的解决方法其实和文章也差不多,原理都是一样的:
1 P9 Q5 B$ }' o4 K& o! {8 @: y! e
% C2 n: l6 e x# C$ c我是看到LNMP官方提供的“防跨目录设置”方法,如下:
0 L2 N. ]' Q( y1 i3 l4 S7 [LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置0 m4 j3 d2 c- |9 O0 U. E- T& n5 r l f
1 T2 J( f1 B6 l& Q# h" f
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。! m* B/ r" W- g8 b8 \7 C
2 c+ K, c: {% Y& C.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
9 Y" ^ u* ?) V9 a3 E1 P/ Q可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
8 o. ~9 R# `( Z1 [7 |& k, q删除的话rm -f /网站目录/.user.ini 就可以。4 G! c7 ?4 Q$ ]- @! w( A$ K
修改完成后再执行:chattr +i /网站目录/.user.ini% S' }' v5 D* Q; v2 c, F
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。, S( ~0 z1 X0 d
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
( P4 B7 S/ l- c: N1 c4 Y7 c' ?% u4 \1 m8 c
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
$ ]. E* ^0 k" Q6 |, a0 q1 `1 b/ f1 y
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。5 ]2 \% D _1 n# m) t" U
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
2 X; O; E% G' @7 b$ f6 U$ P% Q; r& }
& E: |1 g; y' ~) n
5 q* I3 y8 X& S7 `$ L+ F5 [5 u( H! c* f' V! y9 c a y# Q- _
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。; d8 m) r1 u1 t5 B
4 q& W# N2 Z9 e6 A+ r% K重启apache生效。 |