nginx中应通过location精确匹配敏感路径并deny all或return 403/404来隐藏配置文件;优先使用=完全匹配已知路径,其次用正则拦截后缀和危险目录,注意规则顺序与大小写覆盖。

在 Nginx 中,通过 location 指令精确匹配敏感配置文件路径,并配合 deny all 或返回错误状态,是最直接有效的隐藏保护方式。核心是避免这些文件被外部直接访问,同时不影响正常业务逻辑。
明确禁止常见敏感文件后缀
多数敏感配置文件具有固定扩展名(如 .conf、.ini、.env、.log),可在 server 块中统一拦截:
- 使用正则 location 匹配以特定后缀结尾的请求
- 立即拒绝访问,不透出任何文件存在信息
示例配置:
location ~ \.(conf|ini|env|log|sh|bak|swp|gitignore|yml|yaml)$ {
deny all;
}
注意:该规则应放在所有通用 location / 或 PHP 处理块之前,防止被后续规则覆盖。
严格限制特定配置文件路径
对已知具体路径(如 /config/database.php、/.env)做精确匹配,比后缀匹配更安全,避免误伤或绕过:
- 用
=前缀实现完全相等匹配,优先级最高 - 搭配
return 404或return 403,不暴露文件是否存在
示例:
location = /config/database.php { return 404; }
location = /.env { return 404; }
location = /app/config.php { return 403; }
防止目录遍历与源码泄漏
某些框架(如 ThinkPHP、Laravel)默认允许通过 URL 访问 public/.htaccess 或 vendor/ 下的配置文件。需额外拦截常见危险路径:
- 禁用对
.git、vendor、runtime等目录的直接访问 - 阻止
..路径穿越尝试
示例:
location ~ ^/(.git|vendor|runtime|node_modules|bower_components|composer.json|composer.lock) {
deny all;
}
location ~ \.\. {
return 403;
}
验证是否生效与常见疏漏
配置完成后必须手动测试,避免因 location 优先级或正则书写错误导致失效:
- 用
curl -I http://your.site/.env检查响应状态码是否为 403 或 404 - 确认没有把敏感 location 写在
location /之后(后者会优先生效) - 检查是否遗漏大小写变体(如
.ENV),必要时开启underscores_in_headers off并补充大写后缀
可临时添加日志记录辅助排查:
location ~ \.env$ {
access_log /var/log/nginx/env_access.log main;
return 404;
}











