今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下:
]' H; ?7 L0 h# H% F* i* [" P- D( K6 u+ {' W6 H, @4 e, ^
4 @: i/ ], x" vWarning: 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
' o% B8 o Z- I( RWarning: require(/www/wwwroot/zhuyuyun/thinkphp/start.php): failed to open stream: Operation not permitted in /www/wwwroot/zhuyuyun/public/index.php on line 20$ L7 {: S, o' p7 O) B7 P+ I
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' O+ _4 p5 X" @- g3 m/ @& `
. s+ T9 r+ G0 l
6 S x t; ? E9 U5 |& _# \7 e# {
& u* m. Y% ]3 o. E! Q2 c* E9 E7 A3 j: }1 g+ B# q/ x) f" q" V, \; Y
' X# F+ X/ a: z) K* \或者报如下类似:' d0 v$ b1 u7 M c' L$ c6 _& s5 A) `
Warning: include_once(): open_basedir restriction in effect. File(../../staticpayb/WxPay.Config) is not within the allowed path(s):
9 I/ {% t# K% A9 s/ F% S4 ^& D/ U0 Y" R( S! L$ G8 q6 Y6 P
出现问题的原因:
/ U q# G1 ]3 S/ m$ Y; A查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件;" C4 \7 ?7 k/ m9 V
一般情况下是不会出现这种问题的,之所以出现这个问题绝大多数情况是由于服务器的原因,为了安全才做了这样的限制!
8 s6 `& i; [+ J( j, T$ r2 Y
6 M$ S8 b' r+ S5 q1 }7 c解决方法:
/ i8 k, F' A U Y/ Y& ]1 G0 ?我首先要申明的是,下面的方法适合所有类似PHP报“open_basedir restriction in effect”错误的项目,并不仅仅只是适合thinkphp5的人。只要你的PHP报此错误都可以得到解决。
$ Q( W0 e8 s/ Q8 _' r4 [$ j- W' f" E/ R% v, g+ H8 C, D
如果把ThinkPHP5部署在了LAMP/LNMP环境上很有可能出现白屏或500的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了open_basedir选项出错?
; A4 n8 i" z+ E/ u, S打开 php.ini 搜索 display_errors,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为open_basedir的问题。
4 r* C- h: o! F: X3 a" e
( x0 j1 D: |2 U! N h, T; u& t一、php.ini 修改方法& z1 X9 h7 {( n" k7 y
把权限作用域由入口文件目录修改为框架根目录9 ?) D6 G! l# }1 Q( v
% I" Q$ q9 {) N. y. \/ B* \" C
打开 php.ini 搜索 open_basedir,把9 v- x% [7 a# G2 {+ m* N' V. |
- E: G+ q. `) h, n
; ^# a: z A+ n+ F
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
+ [- Q; e0 T8 G, z1 k- w- L! m/ P0 P0 S% H" y" Z8 @9 Z& [; Q+ o; x
修改为1 j. c; B* ?& H2 j
: K8 X6 t- M9 Y6 w8 I$ R/ i
; k8 F1 [* E- B9 G1 yopen_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/" }9 c$ d2 _; o7 b0 s
3 e E7 X5 n! N+ X' t' v
$ Y& q3 l7 W/ {% N# w8 e注意:# Y- l: |: N( s; \( p; A
如果你的 php.ini 文件的 open_basedir 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改> php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置。& Y( e- w! v, |5 ~8 @/ P" V
/ d* O% N/ R* p1 ]$ m# Z二、Apache 修改方法
1 W, s% e8 i8 k9 fApache 需要修改 httpd.conf 或者同目录下的 vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件# y6 x0 |: `; q7 M4 i
' {- _% p3 i( ~3 P
apache' z/ E6 K" L# `0 M" B& p& t- @
├─vhost& m& h/ |0 W4 t: [3 T
├─www.thinkphp.cn.conf
) y" W% [9 T& T# k( q├─......( q( H" B6 U" z; c
├─httpd.conf
5 a: ?1 C( C8 _* |; {( W' F$ O |6 v- }+ m/ q) C
4 A; \, y# W7 L4 J! z
打开 你的域名.conf 文件 搜索 open_basedir,把" ~ `1 [( [( ^
( O" V% w) C- ]! D7 z9 D% O: Z
4 B0 \( H; ~+ s1 P4 A, R7 ]5 Tphp_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
: T6 {0 R, p) ^1 x' S
6 `$ r& Q. d6 s( d修改为4 Q/ W# r& X- @ x% |' L
5 e3 O# H: j b9 m0 N$ n9 Z, `& F& D3 D, Z% { z& x% f8 m( _
php_admin_value open_basedir "/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
9 p; Y f1 |9 l3 E3 ]) I# Z& x2 e( a: N
8 B3 g$ A" A# S, w8 y4 i! t' ^
然后重新启动 apache 即可生效" S3 {3 ~ z. o, ?; g- D: _) c. s( ^
> 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置
! m8 e# z+ d9 p. f/ r& {
9 G3 K5 r# s- `3 {* N三、Nginx/Tengine 修改方法, f- s( f$ e0 O' p* ~' u1 K u
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件& C* q/ a3 P: @( @& a: G
" I% P5 ~# d0 C3 V& p+ P1 f& T
nginx
$ t. i3 D; g7 b9 R8 U2 I0 x$ a├─conf
6 z! R( }& r* S# @9 u% w├─vhost
6 ^" i8 Y. K4 ?4 C: m" e" { Y├─www.thinkphp.cn.conf
( @, Q# o3 h' W2 d9 e! Q2 k2 o├─nginx.conf
8 J: h$ z. D8 ^├─......) ^; y! {$ R$ Y
├─nginx.conf
, v7 f3 Y- M, }. |' u' ^$ O% Y2 f' U! ?* K( p& }
# M7 p! u5 y, H8 ?3 m
打开 你的域名.conf 文件 搜索 open_basedir,把% ]8 ]. }- V5 j" ^! O
8 U' h0 V2 |& C& ?- G! e- i
; H* g" C0 N* ~2 ?fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";
, A6 p6 g8 ]5 t3 x7 |! N. `$ b ?: ^: h( O/ _) p
修改为% N( N! y2 N% W1 K8 r3 F0 U$ d
5 N4 a! A3 G2 U
' S( f4 c% j+ H O& u8 Z; ^0 Ffastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/";5 X1 m8 p: A8 N
8 a" z E8 z2 B' v" j( Y- I" d+ ?4 [* q, p/ m1 T' g% n
然后重新启动 Nginx 即可生效
O) K) F( W9 w$ G5 \域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置
. V* S. L+ x: l4 r
( v; m) k' ~. v' s8 q注意:上面我们修改的时候用的是绝对地址,但是也可以这样直接去找网站根目录(如果你这样配置,你一定要懂不同项目有不同根目录的原理,否则也是行不通的。):
8 o+ X4 V* _* M5 t& g* e' A+ ~fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
! o; e4 I$ B+ [+ g' [ o上面这行代码拿thinkphp来讲,如果你根目录是public,那么$document_root就会指到public;" n5 W+ k& J) [+ W* V2 P* p$ K
依然会生成错误的配置如下:
3 {, M) {" x r# w$ Y6 n7 x$ f; C& c0 [) _; E r! F
& f' x0 l( ~: T; B& s! x4 L
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/";3 f! \8 x( a. V8 v1 h; @* T8 [1 F
; t g+ ]* ]4 x5 a& S. }
7 {3 S/ a: l# Z
四、fpm/fastcgi user.ini 修改方法
" n& f& r2 X x打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
( c$ q6 L+ {1 z, v% ~ Y6 ?# f# D) W2 I1 g# v+ D
9 K: H! ]3 k3 }$ Q
open_basedir=/home/wwwroot/http://www.thinkphp.cn/public/:/tmp/:/proc/
' O$ Y7 c0 S: ~( n+ j( H6 |
+ A2 [- E) L) ?3 s4 L& W9 o. Z修改为
- w8 F( L( |% C. E
5 B; O6 `, T$ w
: v" |; M# ?/ R! w5 }1 z2 s- iopen_basedir=/home/wwwroot/http://www.thinkphp.cn/:/tmp/:/proc/. u, \1 q8 @& U! O4 |
- O O" V, [ d# {2 I
9 W6 V" i6 D* A) \
然后重新启动 web 服务器 即可生效!
. L, |' b9 u3 w0 v* Y) ~ p8 _# B: ~* h! W
总结:
$ Y5 ]- M0 f( Q1 o# m3 J一定要仔细读此篇文章,否则你会选错适合你的方法。
% }: P# Q* M- P, ]# D0 }: l: v一定要根据自己的服务器环境来选择你的修改方法。8 l0 |) P0 C" b/ J; y
9 w5 @ L7 H. Q. ~/ s% _: n$ l5 x! O由于有很多的朋友用的是“宝塔面板”或“LNMP/LAMP“一键安装包的,设置方法可以看评论! w: }& b+ I& [2 J: N
7 ^; r7 S1 L- s4 H5 }; j9 |8 H3 A6 o% Y
) L4 _1 c7 }! d3 F最近发现有很多人用“宝塔面板”经常出现这个错误,一直来Q上私聊我,我就再给大家分享一下。
3 k# f9 T+ J( g/ f8 w宝塔面板出现“open_basedir restriction in effect. ”的解决方法) ^4 {" `; O8 O7 ?
1、只需要在相应的网站目录,勾选掉防跨站攻击(open_basedir)即可!
5 \0 J+ E: k$ S5 n: f2、必须重启PHP;
5 w7 ~! b# f1 P9 {8 d5 N4 v/ C. u0 J+ c2 W
. r, Y2 @1 u# p( ^$ E
" _3 b1 L1 L" w3 n9 `4 K3 }
2 S! u3 Z+ P& tLNMP/LAMP 出现“open_basedir restriction in effect. ”的解决方法
/ e( i1 t- {# k我今天也遇到了这样的情况,我用的是LNMP一键安装包+Thinkphp,然后根目录绑定到的是public目录下,再访问首页的时候出现500错误,后来去 php.ini 把 display_errors 设置为 on 后,报的错误和文章讲的一模一样;* B3 _2 a2 u- C' T0 f1 ~7 `- q
8 v3 g$ J& ?# h4 f$ n' T3 g- S
我的解决方法其实和文章也差不多,原理都是一样的:8 u4 z* w4 Q$ \ u2 L
* ~% |/ s2 p" @9 w0 C! I
我是看到LNMP官方提供的“防跨目录设置”方法,如下:; k# F0 K" j& x& I
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置
6 v) ?9 f: I# N5 @$ Z7 e
3 ]+ n/ r/ j1 x6 C/ yLNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。
; N2 y3 l' C4 V* g; j6 G3 j$ S& |, M# x
.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini$ l) v0 Q; j9 s: y! K8 i! \0 j% Z
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。2 w: p' q# b( E6 P9 s4 ^+ ~
删除的话rm -f /网站目录/.user.ini 就可以。
- ?" W9 Q0 I% Z( m修改完成后再执行:chattr +i /网站目录/.user.ini
6 v) T7 v0 n! d% p.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。, S. D9 R. O9 ~, H1 |
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!
, ~( S7 f6 m7 Z4 V w5 [! R2 g: u! }! r% `
LNMP 1.4或更高版本如果不想用防跨目录除需要删除.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。
( ?( T# {. B) @2 z( t1 b, x* f
9 P& R* m$ H4 m3 W% ]2 p) A( uLNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除,需要输入原网站目录完整路径(注意不是新的网站路径),回车即可。6 d0 y# m( E6 N' @+ L, w5 l
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
3 j1 u" c+ i) j$ h& S+ ]' p! C' b5 x9 { R6 H# R" z( W1 D
% o& B+ n/ X- _, @
- { b4 W8 |* K5 ?* B1 v. pLNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。' N- w) @- Z4 T5 F# O" D' s' W2 D$ e
# g+ Y0 A0 {( ~0 S" K
重启apache生效。 |