使用 Nginx + PHP-FPM 拒绝访问 PHP 文件 (403)

Posted

技术标签:

【中文标题】使用 Nginx + PHP-FPM 拒绝访问 PHP 文件 (403)【英文标题】:Access denied (403) for PHP files with Nginx + PHP-FPM 【发布时间】:2014-06-16 22:01:56 【问题描述】:

我在这个问题上花费了几个小时,尽管与它相关的帖子数量很多,但我无法解决它。我有一个带有 nginx + php-FPM 的 Fedora 20 盒子,直到今天它都运行良好(我猜是在我重新加载 php-fpm.service 之后)。 Nginx 提供静态文件没有问题,但是任何 PHP 文件都会触发 403 错误。

权限ok,nginx和php-fpm都在用户“nginx”下运行:

root     13763  0.0  0.6 490428 24924 ?        Ss   15:47   0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx    13764  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13765  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13766  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13767  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13768  0.0  0.1 490428  6848 ?        S    15:47   0:00 php-fpm: pool www

提供的文件也已设置为 nginx 用户,我什至结束了 chmoding 777 尝试这些文件,但对于任何 PHP 文件仍然“拒绝访问”。

下面是我的 Nginx 配置的服务器:

server 
        listen          80;
        server_name     localhost;

        root            /var/www/html;

         location ~ \.php$ 
            fastcgi_intercept_errors on;
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        

PHP-FPM 池:

[www]
...
listen = 127.0.0.1:9000
user = nginx
group = nginx
...

对于版本:

php-5.5.11(当然还有 php-fpm-5.5.11

nginx-1.4.7

我正在添加 Nginx 错误日志:

 FastCGI sent in stderr: "Access to the script '/var/www/html' has been denied (see security.limit_extensions)" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxx.xxx.xxx.xxx"

准确地说security.limit_extensions 是正确的,设置为:security.limit_extensions = .php

关于路径权限,/var/www/html可以遍历。 我错过了什么?

【问题讨论】:

我知道这听起来很奇怪,但是您是否仔细检查过您是否编辑了有关limit_extensions 的正确php.ini 文件?前几天我犯了这个错误.. limit_extensions 仅存在于 FPM 池中,对我而言,/etc/php-fpm.d/www.conf 中的 Fedora 20.. 但谢谢约翰 您是否尝试过将fastcgi_pass 设置为套接字地址而不是服务器地址(例如 unix:/var/run/php-fpm/php-fpm.sock;)? 是的,我也试过了,但结果是一样的。我对这个问题的想法已经用完了.. 嗯..你能把fastcgi_param SCRIPT_FILENAME设置为$fastcgi_script_name,重新加载fpm然后再试一次吗?没有$document_root... 【参考方案1】:

以下是一些可能的解决方案:

    在您的 php-fpm www.conf 中将 security.limit_extensions 设置为 .php.php5 或适合您环境的任何内容。对于某些用户,完全删除所有值或将其设置为 FALSE 是使其正常工作的唯一方法。

    在您的 nginx 配置文件中,将 fastcgi_pass 设置为您的套接字地址(例如 unix:/var/run/php-fpm/php-fpm.sock;),而不是您的服务器地址和端口。

    检查您的SCRIPT_FILENAME fastcgi 参数并根据文件的位置进行设置。

    在您的 nginx 配置文件中,在定义所有其他 fastcgi 参数的位置块中包含 fastcgi_split_path_info ^(.+\.php)(/.+)$;

    在您的 php.ini 中将 cgi.fix_pathinfo 设置为 1

【讨论】:

您确定将 fix_pathinfo 设置为 1 是否安全?检查serverfault.com/questions/627903/… 如果实现#1 和#4,那么实现#5 是完全安全的。实际上... #1 和 #5 在 PHP 5.5 中分别默认为 .php1 我试图让 .html 文件作为 .php 文件运行,所以上面的 #1 使用“sudo systemctl restart php7.0-fpm”为我做了。干杯。 伙计们,这不安全。在 NGINX 官方网站上,它说它打开了一个允许上传内容的安全漏洞。 当我将 cgi.fix_pathinfo 更改为 1 时,网站运行良好。【参考方案2】:

请注意,上述解决方案(将cgi.fix_pathinfo 设置为1)是一个糟糕的想法。请参阅https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/ 以获得良好的概述。

问题可能在于您的应用程序依赖于 PATH_INFO。为 php 启用访问日志以获取有关如何调用您的应用程序的更多信息,以帮助您调试此问题。

再次确认一下 - 被接受的解决方案是一个糟糕的想法,很可能会让您的网站被黑。

【讨论】:

这不是一个糟糕的主意,它不会让您的网站被黑。这是 PHP 5.5 的默认值。如果您按照此处的说明传递给 PHP-FPM,则可以:nginx.com/resources/wiki/start/topics/examples/phpfcgi/…【参考方案3】:

修改php.ini后别忘了重启php5-fpm服务!!

服务 php5-fpm 重启 要么 服务 php5-fpm 重新加载

fpm 预启动 php5,因此重启 nginx 以应用更改是不够的。

【讨论】:

【参考方案4】:

可能与selinux有关。如果您使用Virtual Box共享文件夹,则在Linux中无法更改此文件夹的访问权限。所以关闭selinux后即可解决。

【讨论】:

【参考方案5】:

供以后参考: 在您网站的 conf 中尝试添加: fastcgi_param PATH_INFO $fastcgi_path_info; 还要看看 SELinux 在做什么。关闭它: setenforce 0 但是然后弄清楚什么脚本是问题并放回 setenforce 1

【讨论】:

【参考方案6】:

如果您的虚拟主机文档根目录中没有index.php,也可能发生这种情况。

仔细检查您的 nginx 配置中的 www_root 参数。然后仔细检查您要访问的 php 文件是否确实在其中。

在我的例子中,我输入了错误的虚拟主机文档根路径,因此将其指向一个空目录,产生 403。

【讨论】:

【参考方案7】:

我遇到了同样的问题,在尝试了上面的所有建议后仍然没有用。然后我检查了我的文件。显然我不是服务器专家。

原来我有一个文件夹 /sites-available 和 /sites-enabled。 我已经更新了 sites-available 文件夹中的默认文件,但没有更新 /sites-enabled 文件夹中的默认文件。完成之后(并重新启动 nginx),一切都开始工作了。

花了我一些时间来解决这个问题,我希望这可以帮助其他人尽快解决它。

【讨论】:

以上是关于使用 Nginx + PHP-FPM 拒绝访问 PHP 文件 (403)的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 错误 FastCGI 在 stderr 中发送:“访问脚本 [文件夹] 已被拒绝(请参阅 security.limit_extensions)”

Apache FastCgi、PHP-FPM、Suexec 权限被拒绝错误

Apache FastCgi、PHP-FPM、Suexec 权限被拒绝错误

nginx 和 php-fpm 套接字所有者

nginx 监听80 为啥php-fpm监听9000

访问 Elastic Beanstalk/Docker Nginx/PHP-FPM 实例中的客户端 IP