Laravel框架加载出错require(): open_basedir restriction in effect

错误详情

Laravel运行环境 Linux Nginx

**Warning**: require(): open_basedir restriction in effect. File(/home/wwwroot/ssmanager/vendor/autoload.php) is not within the allowed path(s): (/home/wwwroot/ssmanager/public/:/tmp/:/proc/) in **/home/wwwroot/ssmanager/public/index.php**on line **24**
**Warning**: require(/home/wwwroot/ssmanager/vendor/autoload.php): failed to open stream: Operation not permitted in **/home/wwwroot/ssmanager/public/index.php** on line **24**
**Fatal error**: require(): Failed opening required '/home/wwwroot/ssmanager/public/../vendor/autoload.php' (include_path='.:/usr/local/php/lib/php') in **/home/wwwroot/ssmanager/public/index.php** on line **24**

解决方法

  1. 找到Nginx中的fastcgi.conf配置文件,一般位于fastcgi.conf文件中
/usr/local/nginx/conf/fastcgi.conf
  1. 打开文件找到如下部分
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

将其$document_root变量修改为项目目录(或者删掉这行),例如我现在的项目是ssmanager(Laravel项目),只需将$document_root修改为ssmanager所在的目录。

fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/ssmanager/:/tmp/:/proc/";
  1. 重启Nginx服务器
/etc/init.d/nginx restart

错误分析

fastcgi_param是什么

fastcgi_param属于ngx_http_fastcgi_module模块的参数,用于设置传给FastCgi服务器的参数及设置PHP配置项,其中包含用户访问IP等及一些其他的Webserver信息;通过PHP_ADMIN_VALUE选项可以给PHP进行配置

(自PHP 5.3.3 起,可以通过 web 服务器设置 PHP 的配置)PHP官方文档

fastcgi_param 语法

名称 选项
Syntax fastcgi_param parameter value [if_not_empty]
Default -
Context http, server, location

其中value可以包含文本,变量及其组合。仅当在当前级别上没有定义fastcgi_param指令时,定义的指令才可以从前一级继承。

下面列出一些常规参数,可以看出fastcgi_param的具体用法

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
  • 通过观察可以看出,我们在使用PHP中的$_SERVER[SERVER_ADDR]获取WEBSERVER相关参数时,其实就是与fastcgi_param的参数对应的。

  • 在编译 PHP 时添加--enable-force-cgi-redirect选项,REDIRECT_STATUSPHP_ADMIN_VALUE则会生效

PHP_ADMIN_VALUE

PHP_ADMIN_VALUE 为一个运行池传递附加的环境变量,或者更新 PHP 的配置值

在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
还可以在为一个运行池传递附加的环境变量,或者更新 PHP 的配置值。PHP官方文档

可以得出 Nginx 通过制定 PHP_ADMIN_VALUE 来给 PHP 设定 open_basedir 配置项

OPEN_BASEDIR

open_basedir作用是将 PHP 所能打开的文件限制在指定的目录树中,包括文件本身。

当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。

其实open_basedir有些注意的地方

open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”

总结

知道了fastcgi_param,PHP_ADMIN_VALUE,open_basedir是什么,就可以知道问题出现在, Nginx 中使用 PHP_ADMIN_VALUE 配置了 PHP 的用于控制PHP自身能打开目录树的open_basedir选项,想要解决问题,可以通过指定对应目录树或者删除此配置即可(简单粗暴)。

参考文章

PHP官方文档 FPM 配置
php.ini 核心配置选项说明

猜你喜欢

转载自blog.csdn.net/zp_00000/article/details/80275967