请求 /.git/config 返回 200,里面能读到远程仓库地址,换成编码后的点号也能绕过去。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,隐藏文件规则只写了点号开头,Nginx 在匹配 location 前会先解码 URI,编码后的点号可能绕过正则。alias 拼接时还会产生路径穿越。
「隐藏文件访问」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
location ~ /\. {
deny all;
return 404;
}
curl -I https://www.example.com/.git/config
curl -I https://www.example.com/%2e%67it/config
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,用 location 正则单独拦所有点开头的段 返回 404;再加一层 deny all 覆盖 .git .env .bak;确认规则放在正则 location 之前或优先级更高;用编码和双斜杠变体各试一次。
最后用这个标准收尾,两个地址都返回 404 或 403 响应里没有仓库内容。
