Nginx中排除敏感目录执行权限需精准匹配路径:优先用^~匹配明确目录(如/configs/),正则匹配隐藏文件(如/.git/),限定目录内禁用脚本执行,并通过nginx -t和curl验证生效。

在 Nginx 配置中,排除敏感目录的执行权限,核心是用 location 匹配路径后,配合 deny all 或 return 403 阻断请求,同时确保不意外影响其他正常资源。关键不在“禁止”本身,而在匹配是否精准、是否覆盖所有访问入口(如直接访问、子路径、大小写变体等)。
用 ^~ 精确匹配敏感目录路径
对明确路径(如 /configs/、/admin/backup/),优先使用 ^~ 前缀,它按字符串前缀匹配,不走正则、性能高、优先级高,且能完整覆盖子目录:
-
location ^~ /configs/ { deny all; }—— 拦截/configs/及其所有子路径(/configs/db.php、/configs/.env) - 结尾斜杠不能省:写成
/configs(无斜杠)会误杀/configserver这类路径 - 多个目录可合并写:
location ^~ /private/ { deny all; }和location ^~ /uploads/temp/ { deny all; }
用正则匹配隐藏文件和版本控制目录
敏感目录常以点开头(如 .git、.svn)或含特殊名称,需用正则 ~ 或 ~*(不区分大小写):
-
location ~ /\. { deny all; }—— 拦截所有以点开头的路径(.htaccess、.git),注意\.中的反斜杠是转义点号,否则.是正则通配符 -
location ~ ^/(.git|.hg|.project|composer.json|package.json)$ { deny all; }—— 精确匹配根路径下的敏感文件/目录,$保证不误伤/gitlab这类名字 - 推荐加
~*支持大小写混用:location ~* /\.svn/ { deny all; }
避免执行权限泄露:特别处理脚本类扩展名
有些目录本身不敏感,但其中可能被上传 PHP、Shell 脚本,需额外拦截执行行为:
- 在敏感目录下禁止解析 PHP:
location ^~ /uploads/private/ { location ~ \.php$ { deny all; } }—— 外层^~锁定路径,内层~精准拦截脚本 - 统一禁用高危扩展:
location ~ \.(php|sh|pl|py|rb|lua|jsp|asp|aspx|cgi)$ { deny all; },放在 server 块靠前位置作为兜底 - 注意:不要只写
location ~ \.php$ { deny all; }在顶层,否则会全局禁用 PHP,应限定在具体目录块内
验证与生效要点
配置不是写完就生效,必须确认几个关键动作:
- 语法检查:
sudo nginx -t,避免 reload 失败导致服务中断 - 重载配置:
sudo nginx -s reload(非 restart),保持连接不断 - 手动测试:用
curl -I http://yoursite.com/.git/config或curl -I http://yoursite.com/configs/db.php,确认返回 403 或 404 - 注意 location 优先级:如果同时存在
^~ /configs/和~ \.php$,前者会优先生效,所以敏感目录的^~规则建议放在配置靠前位置


















