今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
" x- j7 n# T. r) }
5 X" u* K+ F4 y
3 z: H! u$ A @ J6 X; xWarning: 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* K% a4 b- X7 l8 K
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 207 f1 f& J9 ~& K: z' Y$ ^7 P
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
( H% [# ?$ P+ {) l0 e
9 J/ S3 C- G [" J9 m8 n" m
) D% F# H2 y& k, F7 u! b; Y. r* v
0 j+ w2 [4 U0 C, e7 } n" ]4 U
6 t) e6 v6 w* v$ e+ d0 @
或者报如下类似:, G$ T+ p! N5 }; N2 V. [
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):# t5 x6 H: \- E3 E6 s$ ?6 x
% @& ~, y6 Q0 D4 y* ]# u出现问题的原因:! Q0 q4 F& g6 p: {- [/ b
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
$ X, I. z3 C6 E& J2 K" `一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!$ t, f0 i( E/ b: s/ T6 ]/ @8 t) {
3 R+ |- ?5 G$ X: I解决方法:+ j2 w5 J: F4 p3 H: g k8 \" I1 |
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。* Z9 K4 @# c( J
: G9 \6 `! x0 [) q如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
% m; q' @; U4 c# K2 X打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。. s* n T) _% U2 H& J1 x% A3 U. S
+ E; I% u1 J, o$ f1 @" E/ j. r
一、php.ini 修改方法- b0 \" `( `( | g2 l! b7 h4 D0 `
把权限作用域由入口文件目录修改为框架根目录
d# d5 y. x \8 ~
. |& C7 I, b+ i8 i, M* q' ~1 x打开 php.ini 搜索 open_basedir,把
7 ^/ ^; W9 U0 ~1 \+ I% E: }! O- R5 n
7 V7 y: J; K, {. dopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"0 z4 c9 j6 W/ F' G7 G
, k1 [% x$ b0 W% G* k4 @修改为# N( E8 L1 a! n7 ~$ X4 N% z' ]! M
% V! m6 a6 @: N8 ]( X( Q) d5 H! E6 Q+ ]9 c
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"* m" d! Q M* M/ h
/ G% J @9 |& P2 P
9 [' f) Y1 L! v; ?) ]- r/ ?. e; a
注意:
& z4 j+ c$ R7 F) F( R4 \如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。2 M5 g$ s) x, j5 h1 \
+ y8 x$ R2 O1 h3 ^5 E/ f8 O二、Apache 修改方法8 I& {* [* l$ k5 G; |2 C7 S9 [( e
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件6 H" |7 Z9 v1 b( R
1 m/ l: O1 ?7 K4 s+ ~apache( |7 q* O. @" T3 Z9 E# b$ x
├─vhost
; K; p& t N2 v$ \0 V├─www.thinkphp.cn.conf9 Y) g0 T c/ Q
├─......
8 M- t2 _' e0 D4 Z& X├─httpd.conf
p% _7 h" e, ^ l7 u9 y* Z9 r; A& w" X4 \8 C" ^
! p& K6 ^& e. l( \ s) ^+ c打开 你的域名.conf 文件 搜索 open_basedir,把
) R3 Q3 }2 W( d5 r/ M- _' c; m' ]7 a% M" J
, r/ D/ H7 L9 Q) _9 @" y
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"/ A& |, g2 x8 l+ I9 R
/ ^# ~, b; F: H# O" X修改为) Y5 p, I$ I$ u( T2 g' m
+ h& s& d( E; {( V& o
" B9 B! g9 j3 s( u( v' Q* q
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
; I) o1 O& {( ]2 j1 t
) [' p& C* J6 S1 Y6 S: s7 h
8 I0 u8 \, K/ x& c* E然后重新启动 apache 即可生效
- X1 R- o: a8 N. g7 g( ~1 J> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置! Y' l7 V6 [$ E9 Y
8 x9 q* W! A9 R三、Nginx/Tengine 修改方法
2 e' q5 F8 B& H7 S3 r+ k7 B/ O9 qNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
5 G8 ]/ y$ V5 m$ F9 G
/ B1 _0 P# e% G/ jnginx
$ Z X2 C' y4 g/ S1 E├─conf
1 [( G. ^ J4 {8 P( Q├─vhost; i& w9 G+ ]8 [& @) k8 @) i
├─www.thinkphp.cn.conf
7 F- b$ u9 y- {" S* B; s" D├─nginx.conf" j$ o/ K* C4 K6 h
├─......
2 g' ?1 g4 I1 G1 |$ H R; b; w├─nginx.conf
1 q7 u9 X% L) u2 V$ w
5 p2 t! x5 u! v6 `) y9 S/ y
' ~, j# j6 {. ?打开 你的域名.conf 文件 搜索 open_basedir,把1 d) y. j# I( t+ X/ r
! [" q$ z: k ~2 q5 a8 p
9 d, y8 [" R7 T) {# [fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";: U' \4 Z9 |2 i
# }. G+ R' F! B; {8 d# y
修改为" n9 X- p+ U, m. ?
9 H- k9 Q5 Q" H4 R
& L6 L) y' X# L0 Y5 R' L. w
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";/ d' o7 G' l+ l% ?. }% C+ ?" `+ L: b: M
1 o% n% W. n( ^
* B: j6 i! h0 u, ]3 v% K然后重新启动 Nginx 即可生效
1 i$ M9 {) w3 U域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
0 ^( Z# T2 E- z7 I8 z( Q% P
! U; k: z: R: g% ?# Q注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):" v9 g7 {- U7 `, b6 C( A
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";1 t; [5 s( r& s Y6 z( ?
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
$ S. ]$ |+ [8 M/ |- u k依然会生成错误的配置如下:. |# t, d- I- m$ A( Q
7 v+ r' q0 I( M8 A! T& B P# f1 {4 {
& T9 o, x% d/ e1 U/ p
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";- i5 V, i+ i3 J8 D7 Z/ ]+ z7 V) h
$ p2 R u* T# Y0 F" T5 m
* G3 ]+ g* k$ U0 `) ]+ a- Z四、fpm/fastcgi user.ini 修改方法( n7 ^# @$ w" |
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把 S/ W# N/ U0 Z
5 ^, V: j, {' K$ C: T! c. e& ?6 z6 @+ k
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/% Z) m1 i d. q9 [9 V
) t7 w9 g- h$ X+ |+ ^( z6 F修改为' w+ y! z: W4 O$ [* q- ]( k
6 T& s5 Z9 N2 v; t. T' v( Z4 E9 H) _0 U: q! j& ], G
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
( D7 B- X6 ^( R6 B9 m- H3 ~, O( a7 O9 H/ E& W7 o
! O# ~# ^6 i; u然后重新启动 web 服务器 即可生效!
) h7 @' a9 _$ y! J
5 W% V: ~& _! p) G+ S总结:
5 v5 H5 ~' e* W8 L& y) n: F6 @" R4 b E一定要仔细读此篇文章,否则你会选错适合你的方法。
) v8 B$ u9 q& F+ B一定要根据自己的服务器环境来选择你的修改方法。
7 X# k8 w+ W/ v3 R* K- P0 e7 D
1 v0 S+ a x: L8 k5 F由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
* l0 ]6 q: `$ G2 v3 [
) e/ j7 C* u. L/ I; C6 S; s, y
! p n- H' [ h. d6 E* K4 k9 k
( E$ y8 J6 ?: ]( o" \4 f最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。0 u5 `* H$ Q9 {- t) [
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
5 w: [9 Q: ~# {1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
; e- a' w" o/ q' n2、必须重启PHP;/ o% m/ o7 [/ @4 W6 |; K
* t p9 O# A9 {- C" l+ S, @4 K/ R5 }8 o
% s" P7 t. t9 w+ d F
1 C) i+ o6 U& P0 d. u4 xLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法- e2 k# u# h: U% H M) ^9 j. D: W
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;; Q" S0 r3 u: U5 O5 P
! E3 ]8 t# ^1 U- e" {8 I
我的解决方法其实和文章也差不多,原理都是一样的:
8 J4 G/ e9 R9 l2 }3 h3 |5 }( \1 q- O. M3 M* A8 L. O' x( [
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
3 i6 A8 j7 n% A, s! @/ \& L: YLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
- g: h$ c Q+ I! E: E* N; N) P- e; \6 J. D4 t# Z* t
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
- U) B4 x" F1 \ E9 k1 g* A) D3 P- O7 `0 Z# ~; z4 U2 D+ w+ k
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
% B& E' [8 U. `# t/ M, L# j. W可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。( w p. Y! ~ p# u$ d
删除的话rm -f /网站目录/.user.ini 就可以。$ F4 \8 P& H- i' m
修改完成后再执行:chattr +i /网站目录/.user.ini5 o' W; Q8 Y: }. @
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
" W$ k/ `2 V4 F2 \& B4 _如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!6 F' u2 Z- _4 L d5 S
* W: J! N9 u! w7 nLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
% k [1 I. [+ V
+ K( w8 I7 U, u* L: a: U1 XLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
8 X+ ]% a- ^" Y- B7 h在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。* C7 z8 c' L8 q4 o$ E
9 l8 z: [4 P- d( i$ U: M: B, q5 L# p, s/ i1 X. X) o
5 ^2 e" x5 M4 |4 K
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
* o9 ^3 i* j' s1 z
- G3 Q1 b# c7 Z/ J重启apache生效。 |