使用 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 中分别默认为.php
和 1
。
我试图让 .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 权限被拒绝错误