今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
n3 ]0 ^9 u; p+ {8 G( E+ n
% q: u3 m, c% r0 J0 P
n0 q2 \9 f( P) _1 _1 O+ j GWarning: 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/ H6 F j$ d( i
Warning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 208 |. P* J2 r; u
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: K) ^/ K2 P1 L: @& d R+ b7 X
1 n/ F& ]# z4 X% J7 P, I! K2 S" w) _0 Z/ J9 i
8 B; N& H( E3 z- B, n9 L6 |* l& f& X
$ d- z$ y: p$ h, {4 d# d2 p: w
# k6 b) P: m) s4 ?% b7 M2 \( w6 e
或者报如下类似:9 h* d5 q; T! q1 A0 v6 l
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
0 ?: E2 |+ w2 A
: y, |' P/ @/ ]% e/ [$ A) h出现问题的原因:! z( @9 F2 Q& S/ {
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;( B, x# O5 x/ e
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
' w/ q( |: ]1 B% Z, ^, N8 T2 J# |. M
j6 ?4 O$ H" ?3 N! d6 B解决方法:0 Y. V) `5 \2 }6 J# M5 b
我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
4 ]) U% R. O* E& `4 `7 ?2 b4 v( K' z8 f
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
1 v/ k% d+ j3 c4 Q8 G打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
0 V& i, J# K c: e% S
" i& p: v; E2 S8 _6 h: o: L一、php.ini 修改方法3 u7 D8 Y8 Z" S/ b
把权限作用域由入口文件目录修改为框架根目录
: k8 H6 p' g8 x( T% H& H3 L
! Z% E, F! T: O打开 php.ini 搜索 open_basedir,把
' F! @2 L; M8 T: J! P% f4 P- S5 d# z/ B( m, x
* F) `, o4 W1 d# e. fopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"$ f; M' W* ?4 r4 s5 N
\5 E5 A. W% R8 f修改为( ^) _- x8 E. X1 M# @6 I1 P0 L
0 m% X+ ~& M! e5 r/ H/ T8 l, S
: Y% q2 D) F/ c' A+ ^
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"" ?' n* k1 Q# s
& p: P0 k7 N4 z0 L0 E6 q: ^( l' {9 M+ L# E( M$ {
注意:7 s" E+ Z! X3 y! e* b7 X
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
& a v" p! b) x+ O5 X. Q. L3 K: W) X8 X% v9 |# H. s
二、Apache 修改方法$ A6 y/ f- I; [ m7 t
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件8 Z: X* P- A& c0 \
4 U, X7 S: F% x+ Gapache
+ u% C/ X: v& B9 z r$ [) i├─vhost
|( p, |( ?) ?: i8 ?) ~├─www.thinkphp.cn.conf( v A/ p o3 E4 P: d t/ `
├─......& o/ `9 T) |8 Y. v3 B' A1 G3 b% P
├─httpd.conf: C. A3 e9 e# @6 ^7 y- _
; W, j. v# f1 v; {! H1 ]
! ]. i/ n4 u$ }) V6 n5 b: J打开 你的域名.conf 文件 搜索 open_basedir,把
5 P( H" m- a- A$ s3 h
$ p% K6 L9 c/ Z6 B4 I: z3 G; _6 q2 O
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"3 |/ ]' N9 R" l
6 j$ M! G) `: k) H, C
修改为1 d7 \& Q0 V0 H- a# j7 {
) y% C M k7 x4 H6 c$ C2 |
6 U! \3 D: w: a3 Sphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
9 @0 M n! n" U+ p( d ~' _$ h7 a7 E& {+ v& ^. @, O0 T% Y
7 b' o, _3 B* k4 G9 N9 A* p0 l
然后重新启动 apache 即可生效
6 [2 Y8 q" j& P& C* H: q0 r( l> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置# x4 X: Q7 }7 _! H4 ?8 a' ~/ r
- _& {8 r1 i* Z9 I" l
三、Nginx/Tengine 修改方法
! K2 K! D1 j% F7 @6 s2 aNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件: T# V) z4 l. d
, X! A. J3 F4 h( nnginx
8 Y5 y1 o3 H1 f├─conf# j- u8 m% W5 p% ?) z
├─vhost
p& c* n. u A7 V( R8 Z├─www.thinkphp.cn.conf, h* C% ]) y, A( `$ A8 B2 S
├─nginx.conf9 M9 i3 h2 x8 F1 N: m
├─......
7 H" H! q6 Z5 F8 G; p; O# |3 D├─nginx.conf) u8 q2 X: Z2 H8 x' E! k) }
6 e5 G @2 f W6 C! G* {; f3 ]2 {: f6 u6 q6 A
打开 你的域名.conf 文件 搜索 open_basedir,把
8 b8 U: @8 f# [3 Z+ C+ N( i
+ F7 H$ M, @' v4 D5 J$ U; D% \: ~8 ]3 y1 U% V7 _
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
' N6 O6 [0 o' ^: H: A& U# V5 }! \8 x+ r. C: ~1 |% I% B( t) S
修改为
5 d; g' Z1 i. C- ^8 D' s9 J- y' _' J
; }3 S5 }3 k$ yfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";
7 t* S8 a5 b* O
' L1 O( T/ ?+ H! N+ [6 x4 Y. a1 }$ S5 k6 s2 h
然后重新启动 Nginx 即可生效/ m6 X5 m! ^9 e
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
" H! `2 G6 M1 L+ `3 g( Q& n* V' G9 ?" l' e. j
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
U! y& t& J( y( [1 m$ Wfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";" D. ?% n6 b/ Y' n
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;2 R2 t+ |* _4 ^# y, a8 C% k
依然会生成错误的配置如下:
# V9 i% a- w" x# a: S9 f0 o7 e+ K9 v Q
, _/ ~ u5 N- D& C9 Ifastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";2 \; E9 l& W2 n) `8 n
: h7 a; p8 u" P/ `2 o) m! U
2 L8 F" g% a" d3 F& n1 y' E四、fpm/fastcgi user.ini 修改方法* x1 r# @1 n8 C3 u5 p7 H
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把+ b5 i. \" D8 t1 U' w- u$ z
0 @9 R) k* M9 m( P
3 V1 K$ A: d( K! E$ ? w6 {6 Popen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
b. d8 ]/ E. R) m/ P9 Z9 K" V- `# A* m* P1 o8 s2 R( j6 W4 x8 h
修改为1 ~( g4 D8 R E" r- p
" H1 \' M9 e7 z. \, U! ?3 D/ B7 r ?5 `# b
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/
- k; U+ A1 m# a" g! V+ [; U5 O0 W, |1 g! ?
: D( _3 G5 W" s1 i" @( E# E' |然后重新启动 web 服务器 即可生效!
. g2 ^% `, E# d! Q
; `. g, c. v6 G- @# I# Z' ^总结:5 R$ J: W7 X* |
一定要仔细读此篇文章,否则你会选错适合你的方法。6 M6 q7 E' ^8 D! D1 S" h
一定要根据自己的服务器环境来选择你的修改方法。" v/ {- x$ p* ]/ k2 W
7 L. ^1 M# j" ?' j5 [% J( o由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!2 v% T$ H) {/ f! n. ]4 V6 H2 T0 @3 |
/ z/ l$ \4 w# l( }& |1 t- S/ r. s8 Y3 ?( d' w# u
9 q& y+ J8 v2 G3 C$ D
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
; ^/ B% C: X" D. p宝塔面板出现“open_basedir restriction in effect. ”的解决方法9 S" |1 m, V( ~; e$ ~8 i" U
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!; c. |5 j" ^/ ~1 @$ d8 K8 ^% }- u
2、必须重启PHP;
" M z* X) A" O! t: I9 w4 h7 H+ j1 [) R
, J. j- t2 d3 N' t; t/ Z
% _1 f2 z% U. P- M3 F; ?: v7 } E" w I
8 I% k& V# v" k/ N" MLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
4 a9 O* X( Z1 |+ P我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;
! E0 N9 O9 j3 u$ L% t w' M
' B1 o+ f9 A% s9 x- R) @/ E, w我的解决方法其实和文章也差不多,原理都是一样的:
0 X' {' k5 R5 M, r* z- n4 s% q) l0 B% y6 k
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
; }$ p$ i; x z. o" E' LLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
2 C; Z+ T7 S" e1 d" A% z& m4 i1 {
, ^7 H3 U" [" O. |: xLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。) M- D5 t! w% a
( y5 `& T# M. @- z.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
. Q2 M9 R4 o. s/ b! E4 Q可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。4 i5 U; S. I2 y* f
删除的话rm -f /网站目录/.user.ini 就可以。
' F1 }/ g7 t& s3 I _修改完成后再执行:chattr +i /网站目录/.user.ini& {) W) C2 I! H0 v7 Y8 `
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
$ ^3 [4 _5 W& c4 z1 h如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!9 Q8 ]8 q" w, y' o
: }& K/ z# B, GLNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。2 n7 r; m: ^8 K2 c
2 m# B4 W6 F* { v+ I3 f5 wLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。
% r* r% n3 {, U" e9 n; ?0 }在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
. q2 J, E$ e4 e2 r( L- r( k; E
) _/ N5 D2 g$ X% o" t: v6 r8 i
. ?4 L, ~5 M0 F2 w9 z: {1 {; j8 y3 b: a2 t6 e6 A. a# L
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
. D4 @0 L3 F5 i: X3 z
0 W* y" P1 X: p" o重启apache生效。 |