nginx 正确运行 php 需精准匹配、安全转发与路径防护:用 location ~ .php(/|$) 或 location = /index.php 配 try_files;fastcgi_pass 指向真实 php-fpm;script_filename 须用 realpath_root 防穿越;禁用 uploads/ 等敏感目录 php 执行。

让 Nginx 正确运行 PHP,关键不是加个 location ~ \.php$ 就完事,而是匹配要准、转发要稳、脚本路径要安全。下面这几个点踩对了,基本不会出现下载源码、404 或 502。
用更安全的正则匹配 PHP 请求
只写 location ~ \.php$ 容易被绕过,比如访问 /logo.jpg.php 或 /config.php/xxx 可能意外触发解析。推荐用这个:
-
location ~ \.php(/|$):匹配/index.php、/api/v1.php/这类真实路由,拒绝.php作为后缀伪装的文件 - 如果项目入口固定(如 Laravel 的
public/index.php),可单独写:location = /index.php,更精准也更高效 - 搭配
try_files $uri =404;,确保请求的 .php 文件真实存在,避免空文件执行风险
fastcgi_pass 必须指向真实可用的 PHP-FPM 地址
这个值必须和 PHP-FPM 实际监听方式完全一致,否则直接 502:
- Unix socket(推荐同机部署):
fastcgi_pass unix:/run/php/php8.2-fpm.sock;——确认 socket 文件存在,且 Nginx worker 用户(如 www-data)有读写权限 - TCP 方式(调试或跨容器):
fastcgi_pass 127.0.0.1:9000;——检查 PHP-FPM 的www.conf中listen = 127.0.0.1:9000和listen.allowed_clients = 127.0.0.1 - 建议用
upstream块封装地址,方便后续扩展多实例或健康检查
SCRIPT_FILENAME 参数不能依赖 $document_root
用 $document_root$fastcgi_script_name 存在目录穿越漏洞(例如 ?a=../../etc/passwd)。正确做法是:
- 启用
realpath_root:在 server 或 location 块中加root /var/www/html;和set $realpath_root $document_root; - 改写 SCRIPT_FILENAME:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 同时保留
fastcgi_param PATH_INFO $fastcgi_path_info;,支持框架路由(如/index.php/user/profile) - 基础参数用
include fastcgi_params;,再覆盖关键项,别漏掉REQUEST_METHOD和QUERY_STRING
别忘了禁用敏感目录的 PHP 执行
上传目录、配置目录如果允许执行 PHP,等于给攻击者留后门:
- 对上传路径单独限制,例如:
location ^~ /uploads/ { deny all; } - 禁止访问隐藏文件:
location ~ /\. { deny all; } - 避免在 root 下直接放
config.php等文件,没 location 保护就可能被浏览器直接下载
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











