Nginx默认不执行PHP/Python脚本,需通过FastCGI或反向代理转发;禁用脚本执行权限的核心是严格限制仅入口文件(如/index.php)可解析,上传目录(如/upload/)须用deny all或internal禁止直连,并移除.py/.wsgi等匹配规则。

在 Nginx 中,默认不会执行 PHP 或 Python 脚本,它本身不解析脚本,而是通过 FastCGI(如 php-fpm)或反向代理(如 uWSGI、Gunicorn)将请求转发给后端服务。所谓“禁用脚本执行权限”,实质是防止用户上传的恶意脚本被意外执行——核心在于**严格控制哪些目录允许交给解释器处理,其余路径一律拒绝执行或直接返回 404/403**。
明确禁止非公开入口目录的脚本解析
常见风险点是网站上传目录(如 /upload/、/static/、/images/)被配置成可执行 PHP/Python。必须确保这些路径不匹配任何 location ~ \.php$ 或 location ~ \.py$ 规则。
- 在 server 块中,把脚本解析规则限定在明确的入口文件上,例如只允许 /index.php 或 /api/index.php
- 避免使用宽泛匹配:location ~ \.php$ { ... } 应改为 location ~ ^/(index|api/index)\.php$ { ... }
- 对上传目录单独加 location 块,内部用 deny all; 或 return 403;,并显式关闭 fastcgi_pass
关闭 Python 脚本的自动识别与转发
Nginx 本身不原生支持 Python,若启用了类似 location ~ \.py$ 并配置了 fastcgi_pass 或 proxy_pass,就可能触发执行。除非你确实在用 CGI 模式(极不推荐),否则应彻底移除这类配置。
- 检查所有 location 块,删除任何针对 \.py$、\.wsgi$、\.cgi$ 的匹配规则
- Python 应用建议走标准反向代理:仅对应用监听地址(如 127.0.0.1:8000)做 proxy_pass,且 proxy 目标不暴露文件路径
- 禁止在 Nginx 配置中出现 script、cgi、wsgi 等关键词,除非你完全清楚其作用
利用 try_files + deny 防止路径遍历与伪装执行
即使没有显式匹配脚本后缀,攻击者仍可能通过构造 URL(如 /uploads/x.jpg/.php)绕过限制。需结合 try_files 和 internal 机制加固。
立即学习“PHP免费学习笔记(深入)”;
- 在静态资源 location 中添加 try_files $uri =404;,确保只返回真实存在的文件,不交由后端处理
- 对上传目录启用 location ^~ /upload/ { internal; },使其只能被 Nginx 内部指令(如 alias + try_files)访问,无法被用户直连
- 配合文件系统权限:上传目录所属用户设为 www-data(或运行 Nginx 的用户),但移除执行位:chmod -x /var/www/site/upload
验证与日志监控要点
配置生效后,必须手动测试边界情况,并持续关注异常请求。
- 上传一个 test.php 到 /upload/ 目录,用浏览器访问,应返回 403 或 404,而非显示 PHP 代码或执行结果
- 检查 Nginx error log,搜索 FastCGI sent in stderr、No input file specified 等提示,确认未发生误转发
- 定期用 grep 扫描 access log 中含 \.php?、\.py? 的请求,尤其来自非常规 UA 或高频 IP 的访问











