今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
/ Q1 p) E, T! @1 B5 f, `
r t$ K: ?, ^% h( [# L( \/ Y9 V; k3 ?8 a
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
+ p s2 C% Q- r9 YWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
% J) ]) m. T; a sFatal 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
; r. k) o( P! r! p3 N+ n$ Z( T
; m1 K+ p& V! l1 g1 I
; `+ [ C& W/ K; e! Q
6 G4 k" H& T+ c6 n8 C
/ _/ w1 T- a; C# o' R$ P" B2 i3 k" C0 c; _8 y# r) p5 s
或者报如下类似:
) t0 ~) l0 M5 y1 X; w/ ZWarning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):" H* y4 y: u Y; j) Q; d3 ]
# s# e; X* L. X% g) c8 b出现问题的原因:' K* O; o4 M; L/ {' g
查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
% r7 {6 |6 E3 z) b. S& [一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
0 ] _( `" m; j# m& O' x
( Z ~6 t" D, ^& x6 h解决方法:
) v D2 u/ G" o1 Z+ R我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。" w2 F! h9 U# U1 ]+ H# D7 l
& T0 {8 M& G+ ]& H' k
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?, i h/ _6 d ^
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
5 i9 G' n7 ` y- s2 Q. r+ O Q2 g$ n/ q6 Y2 V, K* P
一、php.ini 修改方法! c6 ^( X% J/ n$ z
把权限作用域由入口文件目录修改为框架根目录
* v; [! c. t& |( ]8 _+ _ b8 ]
打开 php.ini 搜索 open_basedir,把" R& S5 W1 ]+ J. G, {4 o& {
; ^5 n8 f6 d# r6 P% a2 g" @! `% ^8 X' U; r% i. ?1 S# |, S
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
* K- o) b' G) O1 J* G+ X' J* T( b/ |% B8 |% I6 H- @
修改为% o0 E/ ^ j% i9 T1 B% s' _" t3 ?
$ X- b- U. t+ ?3 [ ^
$ c* z, d0 c6 F3 V$ G7 L3 lopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/") J% e& |& B4 a9 ~ Z9 e
( \4 l" e0 o! S0 s& K1 Y
1 n+ z- K0 c) n0 e1 { W$ K; [注意:
/ v3 _7 N5 A% @: ~9 Y- N/ e如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。5 N4 s/ ? A' m" R+ ]1 u, d, W$ X9 j
2 k, b J8 ?8 N二、Apache 修改方法
5 W& F0 M% H9 N' y% MApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
- |3 e9 j* O5 B+ E! A' T! Q% r
, F0 v7 z' W4 O$ c+ Y7 Q) P# ~& g6 Xapache: }+ a: W8 ^% F8 Q/ ^4 q- N; }
├─vhost: h: T& o. v8 P& L( j* I) g: W
├─www.thinkphp.cn.conf, {# z; S' f; a: _( k6 S0 L
├─......
4 q: x) n3 F8 m! y├─httpd.conf
/ G/ {; L0 D% o; C& k" V* t9 t7 a9 C
. a$ A6 x9 e* B$ n* \
打开 你的域名.conf 文件 搜索 open_basedir,把7 k! E- c" [6 N. H4 I8 b- [
9 f. S4 q) p0 m1 @- N. F( V* X6 m% e" `, T0 s3 _! Y
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
# S, ]3 |, P: R: {- C0 P: I+ k5 d+ x8 @- a
修改为
6 ~2 J7 O) r9 S2 {( m/ z$ Z2 V/ z
4 d' @6 ?8 P5 H& M# N8 @7 I$ _( h" R8 n8 b
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"! ?( g T7 q, D# y0 ~
5 d( k5 J. ]$ n
f* P) H9 G5 V2 U2 R2 N' V然后重新启动 apache 即可生效' a) i# u7 W _; Y2 M, O
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
) D0 v1 V4 G* @4 E% @, l7 E' Q" C, h$ p; j |4 m) U
三、Nginx/Tengine 修改方法
, t {) U7 v9 u' ^' G& yNginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件& U1 n4 ]! W/ l4 m: _
, q8 p" w6 t, b. w' y7 Y( f4 a
nginx6 [2 w. x$ I/ e6 n8 x
├─conf1 q0 X* p' X- J( j5 \- |
├─vhost, x( \% @; d0 G& z. B
├─www.thinkphp.cn.conf5 G+ K6 l- k7 G; z) q
├─nginx.conf
7 R6 L5 D- `1 Z E. x$ q0 U/ I├─......+ }1 x% c1 C$ ]+ V( J( R8 [: o
├─nginx.conf+ S h9 ^, ^( Q# t
U/ `5 b2 O+ B" Q0 N
/ s/ |3 L' t+ g3 |9 ~
打开 你的域名.conf 文件 搜索 open_basedir,把 p) W' K3 h% r; Q
/ s3 _7 e/ _6 A, w, S4 M( i
: N. U1 V* P$ }9 I* e1 @: ~
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
: C: ~" ]9 M5 B X
D9 q% @! _5 h修改为8 p4 O; C; d; \. ]6 A+ s3 Z
; M1 @4 T. z1 Q8 q1 m4 N+ |: C4 ]5 @; z2 @( X/ Q
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";- M9 @% w/ {4 O0 Q
6 J7 f' {" M; [! @1 o
u+ ]% y# x3 q9 {然后重新启动 Nginx 即可生效5 o# Z. j `( g) S- W
域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置6 C8 b( W+ z. P0 ~" X( E
) ^% J3 k+ f* E q$ C4 D注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
' L, a0 |% L, `) Dfastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";# F$ |8 L3 X: t
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
' K1 i; b& p1 [- v+ T# c: a依然会生成错误的配置如下:8 l* ?7 y8 d: g7 M# x7 w9 I" D
# Z- j+ J' B( g: K) N8 G" l! t: Z
! T% W" v& l& ^! O* w! Lfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";( ?# f k, j. B+ n% O: d
7 ?7 o2 i# }. u" F# t0 ]
w# h3 }1 ]# {% m6 o9 D
四、fpm/fastcgi user.ini 修改方法
. b% ]. j/ v" \7 C( |& g3 m. a打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
- l; t6 a5 }: I+ m' @1 F J6 x8 U- G7 k) Y
! { M5 o' H* W" ^% o, zopen_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
" i& _4 U& U5 N6 _5 e1 `3 A2 v1 R0 Q, u) j
修改为
/ ], ~3 E4 R, Q' j' H( s+ {
& z% |* @& f4 S& L5 t8 {" `; a4 K: h. U( k1 P }: X, Y
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc// t! w" S. v& L
, P# }8 I( l9 H: U
P' |+ Y3 Y& c5 b+ Y v然后重新启动 web 服务器 即可生效!- m1 l# {: u; Y \8 B5 e6 @
5 Y. }* d# n0 m% m" C: F* f( k+ W
总结:$ |( c( K: Q# @# d4 ]- B: B; k
一定要仔细读此篇文章,否则你会选错适合你的方法。$ Q6 L- P# n9 Y& S
一定要根据自己的服务器环境来选择你的修改方法。
( @5 P) J7 `8 S! C: R6 W/ p8 b. T# K+ m& d
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
; y5 S" P7 A9 F
( H& K6 |- q4 C6 q; p* V
. Q6 Z8 v/ w2 q. F
* ~5 s5 A$ e' n# I最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。2 r' O9 r2 O, r; O' @
宝塔面板出现“open_basedir restriction in effect. ”的解决方法- \7 m' O, b7 l: U9 I
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
) g [5 ?8 r6 ]3 O6 u% w2 V" k- ]0 x2、必须重启PHP;/ O/ ?* x# [, L3 f
! H$ \7 N$ J* L& E Y* H4 V1 \/ D4 ?+ m
( e! r, ~% X3 H+ D
2 A% L( H+ j7 ?, DLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法, j- e+ b. ^4 }- m7 b$ Y
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;1 {3 p* T2 V z5 a b c. L5 J
% Y6 N! H h j! Z4 ^" |
我的解决方法其实和文章也差不多,原理都是一样的:
\$ x4 M8 w: A! v
! Q3 v) A: g* M) y1 R我是看到LNMP官方提供的“防跨目录设置”方法,如下:0 O' {0 M k9 z; n
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置+ I5 P9 _9 l6 F! b" Y) m( G# J
# @6 I# @1 R# R3 A6 u5 C
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
; _, S( }/ ?# R3 }: ~" ?) s# `1 v5 {, f! L
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini8 W. y0 N5 |& u- }2 q9 Q- N7 u
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
7 J& m# g* M( |. H删除的话rm -f /网站目录/.user.ini 就可以。
$ }& Q3 I( E3 j4 y6 k. n修改完成后再执行:chattr +i /网站目录/.user.ini8 z- t; j3 s) L! Z2 c
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
) u/ M1 n, V% I如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
/ h: J5 G9 w) n9 G$ w- ]$ | o5 J7 Z! \/ ?, S5 q: m% K4 s
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。/ N, G* x) R3 M) s5 U6 G/ f
1 m3 m# M$ \- u U: M+ KLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。+ ~$ b- B) ]5 E( O! C% E
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
+ a b' v2 f: r! G7 Y) v9 n
. ]+ z' T$ e. J' H- X3 ] F- b& N0 l* w/ `; P
+ g Q4 s. G8 U3 ~4 o
LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。
- m/ \- y' k4 L9 ? c
8 ~- a6 P1 c- P" X. @重启apache生效。 |