应优先使用location ~ /. { deny all; }统一屏蔽所有点开头路径,并置于location /之前;再用location ^~ /.git/ { deny all; }前缀匹配强化防护,最后以location = /.env { return 404; }等精确匹配关键文件,确保分层防御、优先级明确、防绕过。

直接在 Nginx 配置中拦截以点开头的隐藏文件和 .git 目录,核心是用对匹配方式、放对位置、避免被覆盖。不是加一条规则就行,而是要分层防御、优先级明确。
统一屏蔽所有以点开头的路径
这是最基础也最关键的一步,覆盖 /.git/、/.env、/.htaccess 等全部隐藏资源:
- 写法:
location ~ /\. { deny all; } - 必须放在
location /和其他通用 location 块之前,否则可能被宽泛规则提前匹配而失效 - 建议加上
access_log off;和log_not_found off;,防止扫描请求刷爆日志 - 该规则匹配任意层级中以
/.开头的 URI,比如/api/.env或/static/.git/config
单独封禁 .git 目录(增强防护)
仅靠正则可能因大小写或嵌套路径漏判(如 /.Git/),需用前缀匹配确保万无一失:
- 写法:
location ^~ /.git/ { deny all; } -
^~表示前缀匹配且优先级高于正则,不参与正则竞争,语义清晰、执行稳定 - 结尾加斜杠
/.git/明确匹配目录及其子路径,避免误伤同名文件 - 可顺带加上
location ^~ /.svn/ { deny all; }、location ^~ /.hg/ { deny all; }等常见版本库
补充精确拦截高危单文件
对 /.env、/wp-config.php 这类泄露即失守的文件,不能只依赖模糊匹配:
- 根路径下的关键文件用精确匹配:
location = /.env { return 404; } - 加
$锚定结尾防绕过:location ~ /config\.php$ { deny all; } - 避免写
location ~ \.env—— 它会误拦/public/.env.example等合法路径
验证配置是否生效
改完别急着 reload,先测试再上线:
- 重载配置:
nginx -t && nginx -s reload - 用 curl 测试:
curl -I http://your-site.com/.git/应返回403或404 - 检查错误日志:
tail -f /var/log/nginx/error.log,确认出现access forbidden by rule - 确认未暴露敏感头:
curl -I http://your-site.com/响应头中不应含Server: nginx(需已设server_tokens off;)











