今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下: {9 i3 S; I( \- f% v# @: M+ j+ M4 X
3 e U0 j8 l& Q' Z
& z. q. x, a" s1 ?$ g& _' m 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
% E) ^3 A! Z& m X3 F2 l! VWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20
9 Q! o0 P2 w9 U8 uFatal 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$ T8 B" Y, K/ i1 P5 Z% ~" B
0 l$ t- g* x! E" K x/ k! r$ G
* }9 T, T$ V/ D j n! U7 ^( B
' V) P" x6 g0 P' m d: x' E2 F, R2 _% d+ @
/ I; @3 O0 ]+ p
或者报如下类似:" Q+ s& f5 C5 {/ t! n( `* Q
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):7 @" p8 ?# `/ t) z u/ ?& L' k% B
3 e* y. g" F5 C: X" q2 w
出现问题的原因:
6 d$ n; X1 d$ Y7 D! u4 |9 t; e1 ?- T查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;
4 B1 A7 I+ g8 y1 u! Z# w7 A$ _一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
2 U3 e" N' N) v# d6 W# x; g. j# C/ N7 m4 o8 N9 j$ N" P
解决方法:
( R6 z/ l7 l4 G" c; E, b" F7 i7 M我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
3 g0 F* P. J) q6 X$ a( e
8 V: T! P& |, t+ j: [' Q& c- b* j; Q如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?/ I* N7 _- a/ `! M
打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
& m- Q, a) j1 Z* j; T& L' z5 [2 i# t9 Y
一、php.ini 修改方法" Z, S" P5 M0 \- s5 [
把权限作用域由入口文件目录修改为框架根目录. f" W$ s. f$ V: _+ F
0 {+ v5 V- R. A* @# W& R! O+ k
打开 php.ini 搜索 open_basedir,把
! h. U: y+ C7 v# ^3 `4 Q8 X. t% D7 m' r c6 i
& b7 q# s2 y+ Q7 w0 D/ nopen_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"3 R- i5 m& d/ ^1 G# |
: l; h9 e5 @ ~) i修改为; e. x" y; v! Q6 {
) @# `. V/ a- | F. s
3 d) x$ z7 ]5 z h7 S3 Oopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"6 _, y7 k2 j& ]. `0 p+ ?2 d4 ]# v
' E- w4 B/ l, I( z \8 k2 M
" C2 D) V2 ]4 x6 A+ P, W& H7 ]注意:
1 O$ C/ Y+ p7 g/ x# L6 h+ S如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。
- q; Y4 Z! ~/ \: N5 G E/ k
G- e% k% Y5 B6 Q* _二、Apache 修改方法$ r. @+ J8 B8 X4 f. s( u* i
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件9 A! U4 N7 V' Y2 i- g8 `1 V) R
) k3 V5 z. i; e) x
apache5 T+ S) U9 T. }& i
├─vhost! J1 \( E3 N) C n! }8 g2 |
├─www.thinkphp.cn.conf
: j! h \! A' a+ o2 V( |4 e, t├─......
# T0 K: d6 ~/ `* }; j├─httpd.conf9 g: s8 C1 K, P+ c0 V2 T7 o% I F
4 i/ O. i3 F6 [6 z+ n; _/ a
- Q' f+ M( d9 ^
打开 你的域名.conf 文件 搜索 open_basedir,把( L+ L- T( S+ _: {
* y0 K0 ^* c* `$ v: w. c# x/ }4 D. M0 ?8 P7 ?
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"6 K8 N7 g1 F3 s( G
9 i8 l" m" |3 E0 r7 x/ p9 U! g1 a6 E
修改为. `2 N" u5 n; F! ~
1 D" m, }/ }* d6 X: |: `! w3 h
/ b6 @+ e. f* zphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"4 j! Q7 ~ f6 v
5 d2 m8 L3 b- m# O
- p5 { J% L" W: v. ^! m然后重新启动 apache 即可生效
- u( x# G, b0 n6 S$ M' W> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置! _3 a4 {9 x# t$ H
! ^5 D4 F3 N5 V- @5 Z; d6 x
三、Nginx/Tengine 修改方法
0 [, Z3 I6 n! `* X+ q: j( {& x& w( {Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件
& a3 R5 v( b& N: A7 B( V- e4 I( z- u& ~
nginx3 i/ j+ x1 p# ~; ]$ z u; R$ d
├─conf
& i! J$ |; _) O# q% ^, [. ^& _& u4 g├─vhost" _$ ?. P) m, V8 h+ I* X4 c
├─www.thinkphp.cn.conf: U( ?5 J# |8 Y% m) \8 n
├─nginx.conf
3 l) h/ o3 A6 n, Q+ D. \7 F├─......+ Z# m! V& b$ L4 i) h
├─nginx.conf
9 J' @( o2 \ u) s3 w
$ P7 n$ Z7 f: ^7 x* H5 u* B( F" c# {3 \) p4 W+ h: l; h+ K. ~' M
打开 你的域名.conf 文件 搜索 open_basedir,把
* X3 W" F8 N+ C7 f6 a* C/ P3 T$ [9 i k0 J/ @
# s. t. A( c0 F
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";8 W, N3 \ }7 e! n9 S
- N2 t* o, m; z# z w2 D
修改为
( a# O" H9 e1 D" P: D9 ~) \. n5 K/ J( F% v" ?( ]' B( R
) m! j1 e' M7 A, b# `' R# G1 S
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/"; C2 y1 O5 j6 a- H
' K5 B0 s# C( ~# z2 I
0 B. L" q& N% u/ W+ @+ T/ J9 F然后重新启动 Nginx 即可生效
9 f. a O" p/ M' A域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置3 s8 L& f9 G/ T1 ?: A
$ l) ~: y8 g" I: K# m* { L8 z L
注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):1 ]; u4 L& v7 V5 o/ S( q7 @$ b& C
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";+ y0 V+ R5 @' q# b& `% G
上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;
1 E/ m! l: {# z, Z% b1 x* u依然会生成错误的配置如下:
4 ~, n2 D8 H4 B, W9 z- e
: q: z ?' ?( J+ k* O3 T& c. T; _& C
/ J$ p4 z: h7 \" X7 nfastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
3 a9 T( _' }. \
4 _3 x% J+ a4 l' `+ }. ~1 N& e. \2 a9 d5 F! ~+ w* p* W6 [
四、fpm/fastcgi user.ini 修改方法, o% Z# E* ~7 N- r3 J
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
& P, |; p8 a5 h7 G! ~' ~5 v' e6 c4 B% i7 B' {0 O7 _) w
, V* f" h1 P* q, |& m0 o5 Q0 C
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
0 Y/ K5 b8 m% q4 {$ w
, I+ u, X# z2 _3 M9 x+ i9 v! `修改为
3 f2 \6 `: N0 U; Z' r2 `6 {: X2 h6 D. M l. [. y
3 ]* @, _2 t C( v* i
open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/# p- H0 R6 i, h) q4 d; C1 y
* O% y, L" G; L) l5 h' l, r
" m, j1 ?7 A* b/ @
然后重新启动 web 服务器 即可生效!
) p2 i' a% Q) L9 k. c. n" u/ t
0 _ b0 ?2 W; M总结:! o1 n# D0 n% X# P0 s" c" }6 ^! q
一定要仔细读此篇文章,否则你会选错适合你的方法。* b* ^7 z5 y! z; c/ q$ l6 p: ^: H
一定要根据自己的服务器环境来选择你的修改方法。
2 g5 a" v. F: q2 {' U' R) d3 r3 _2 c- K
由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论!
5 Q2 ^4 V4 { Q4 w1 `
( j8 o+ P+ |, o& s6 L' \4 I& \, H; y, v
( X. z* U- r% ]. F. a
最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。4 h' q) q: o N; L+ d. V1 `5 P
宝塔面板出现“open_basedir restriction in effect. ”的解决方法+ Q/ B' e% c1 s/ s. h `
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
$ y$ S7 `! d# c+ t2、必须重启PHP;
2 c& L; v, H6 l7 K: J
- C* w9 z) B ?: @+ b) ?* g: W4 L0 g
, @" q% ? [( i9 J- ~4 X7 ~- M. a- s. z$ o+ e
# M0 B7 i/ v2 j2 L% i9 nLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法; e# G, }! Z* x! T1 c8 S1 X) ^
我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;4 R/ s$ F; } Z3 s6 X' l
# p! |3 X# q0 r5 u- J' X0 q
我的解决方法其实和文章也差不多,原理都是一样的:0 O3 E$ Q. @) b' ?5 [9 d
- M3 R0 o0 x) a, L& Z
我是看到LNMP官方提供的“防跨目录设置”方法,如下:
) v' f. N8 x1 uLNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
7 A$ m; n' M+ J- i! \0 ?1 W9 t) B4 o2 z* c& K
LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
- b# `. A0 U5 Z6 W% S* C7 [* S+ @, b" \0 [' g @
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
- W* r$ O# m4 W2 ~可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
' w* X% ~$ X$ [3 C) s4 O/ R删除的话rm -f /网站目录/.user.ini 就可以。7 B N1 t( O# @* }! B: e
修改完成后再执行:chattr +i /网站目录/.user.ini
' f6 H+ K5 t: g4 e.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。: d) P2 y b, a0 n3 ^5 G6 {
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!( ~: q- | q$ H+ L
) K6 W! B. M# u2 H7 ~1 W
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。2 O: e$ L3 M: Z* e( [# m" R
1 M4 I0 c" j# H3 o; t5 d RLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。- a. H/ Q) n" b, `
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。; \/ w5 C8 z2 u8 S1 [0 ~" Q7 v4 O9 T
. [& {6 j s8 Y+ [4 u K! W: H; \" {8 f# c
) |0 E. z0 A; k) [; o/ c: L! cLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。; ?3 ?4 w2 O5 _! X! M, f
) z }4 o* y) Q# o- j' M" `重启apache生效。 |