应禁止静态资源目录执行脚本:在server块中添加location ~ ^/(uploads|static|images|css|js)/.*.(php|php5|phtml|pl|py|sh|cgi|exe|bat)$ { deny all; },并置于PHP处理规则之前;对纯后端目录可直接return 403。

在 Nginx 中,静态资源目录(如 /uploads、/static、/images)本不该运行任何脚本。若不加限制,攻击者可能上传恶意 PHP、Python 或其他可执行脚本文件并直接访问触发,造成严重安全风险。核心思路是:**匹配该目录下所有脚本后缀请求,并统一拒绝**。
只允许静态文件,禁止执行脚本
这是最常用也最推荐的方式——针对目录路径 + 脚本后缀双重匹配,精准拦截:
- 在
server块内添加如下配置(注意:必须放在location ~ \.php$ { ... }之前,否则会被后续的通用 PHP 处理规则覆盖):
location ~ ^/(uploads|static|images|css|js)/.*\.(php|php5|phtml|pl|py|sh|cgi|exe|bat)$ {
deny all;
}
-
^/表示路径开头;(uploads|static|...)是你要保护的多个目录名;.*\.匹配任意文件名;括号内是常见危险后缀,可根据实际需要增删 - 该规则对
/uploads/test.php、/static/123.phtml等全部返回403 Forbidden
更彻底:禁止整个目录被访问(连静态文件也不暴露)
如果该目录纯属后端写入(比如日志、缓存、临时文件),完全不需要对外提供 HTTP 访问,可直接封死整个路径:
- 例如禁止访问
/runtime和/storage/logs:
location ~* ^/(runtime|storage/logs)/ {
return 403;
}
-
~*表示不区分大小写匹配;^/(...)/确保精确命中目录前缀;return 403比deny all更明确、无歧义 - 这个策略比“只禁脚本”更严格,适合非公开资源目录
补充建议:配合其他安全措施
单靠禁止脚本还不够,建议同步落实以下几点:
- 上传目录的 Linux 文件权限设为
755(目录)和644(文件),且 Web 用户(如www-data)不应有写+执行权限 - 确保 Nginx 运行用户与 PHP-FPM 用户分离(例如 Nginx 用
www-data,PHP-FPM 用phpuser),降低提权风险 - 在应用层对上传文件做白名单校验(如只允许
.jpg、.png),而不仅依赖 Nginx 配置 - 定期检查上传目录是否存在意外的可执行文件(可用
find /path/to/uploads -name "*.php" -type f快速扫描)
配置完成后,务必执行 nginx -t 测试语法,再用 systemctl reload nginx 生效。不需要重启服务,热重载即可。


















