lnmp,PHP程序访问网站主目录外的文件访问错误的解决方案
最近有位客户在安装勾股系统的时候,一直报错,明明composer install已经成功,文件也没问题,就是报错无法加载文件,后来终于找到了解决方案,在这里记录一下。
本次问题的运行环境是:centos lnmp
问题:本地是可以正常获取目标目录里的文件,但是通过浏览器运行不能获取系统目录文件。
// [ 应用入口文件 ]
namespace think;
if (empty(file_exists(__DIR__ . '/../vendor/autoload.php'))) {
echo '您还未安装PHP依赖包,请输入命令安装:composer install,安装教程点击<a href="https://blog.gougucms.com/home/book/detail/bid/3/id/8.html" target="_blank">这里</a>。';
exit;
}
require __DIR__ . '/../vendor/autoload.php';
解决方案:
1、查是否有权限限制,通过修改文件目录属组属主和给定权限
chown 和chmod
2、可能是selinux限制,关闭selinux就行。
3、很大部分是有关nginx fastcgi设置问题(本次的问题是这个原因导致的)
本次的解决方法
我们找到系统环境中Nginx中的fastcgi.conf配置文件,一般位于fastcgi.conf文件中,路径是:
/usr/local/nginx/conf/fastcgi.conf
打开文件找到如下部分
# 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
变量修改为项目目录(或者删掉这行),例如我现在的项目是gouguoa(TP项目),只需将$document_root修改为gouguoa所在的目录。
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/gouguoa/:/tmp/:/proc/";
注意:重启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的具体用法
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_STATUS和PHP_ADMIN_VALUE则会生效
PHP_ADMIN_VALUE 为一个运行池传递附加的环境变量,或者更新 PHP 的配置值。
在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
还可以在为一个运行池传递附加的环境变量,或者更新 PHP 的配置值。PHP官方文档
可以得出 Nginx 通过制定 PHP_ADMIN_VALUE 来给 PHP 设定 open_basedir 配置项
open_basedir作用是将 PHP 所能打开的文件限制在指定的目录树中,包括文件本身。
当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。
其实open_basedir有些注意的地方。
open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”
- ThinkPHP6伪静态设置并隐藏默认模块名,如home
- 阿里云ECS云服务器CentOS7云盘在线扩容操作
- lnmp,PHP程序访问网站主目录外的文件访问错误的解决方案
- 开源的 OA 办公系统 —— 勾股 OA3.7.22 新版发布
- 国产开源操作系统 深度操作系统deepin 23 Preview发布
- 前端报错:was loaded over HTTPS, but requested an insecure错误解决方案
- 在linux系统对Gitee代码库生成/添加SSH公钥
- thinkphp6一个部门可以有多个负责人主功能代码
- PHP快速查找value所在数组的索引值
- ThinkPHP6的伪静态规则整理(apache、nginx 、IIS)