最简写法是 require all denied,需置于对应directory块内;因windows大小写敏感,推荐改用 require all denied覆盖.git/.git等变体。

Apache 2.4+ 中禁止访问 .git 目录的最简写法
Apache 默认不阻止 .git 目录访问,一旦项目根目录被直接暴露(比如没设默认首页、或路径拼错),攻击者用 /path/.git/config 就能下载仓库元数据,泄露分支名、远程地址甚至凭据。
在 httpd-vhosts.conf 或 httpd.conf 的对应 <directory></directory> 块内,插入以下配置即可生效:
<files>
Require all denied
</files>
注意:.git 是文件名(不是扩展名),所以不能用 <filesmatch></filesmatch> 写成正则;Require all denied 是 Apache 2.4 的标准写法,Order deny,allow 类旧语法在 XAMPP 7.4+ 会报错。
为什么只禁 .git 不够?还得封 .gitignore、.env 等文件
攻击者常批量探测敏感文件,.git 只是入口之一。实际应一并拦截常见高危文件:
<files>Require all denied</files><files>Require all denied</files>-
<files>Require all denied</files>(含依赖结构和脚本) -
<files>Require all denied</files>(可能暴露测试路径或 DB 配置)
这些规则必须放在和项目 DocumentRoot 对应的 <directory></directory> 块内部,否则不生效;如果项目在 C:\xampp\htdocs\myapp,就该写在 <directory></directory> 里。
Windows 下路径大小写陷阱:.git 和 .GIT 都得拦
Git 在 Windows 上默认创建的是 .git 目录,但某些 GUI 工具或手动操作可能生成大写的 .GIT。Apache 默认区分文件名大小写,单写 <files></files> 拦不住后者。
稳妥做法是用 <filesmatch></filesmatch> 正则匹配:
<filesmatch>
Require all denied
</filesmatch>
这个正则覆盖 .git、.GIT、.Git,也防住 .git/ 路径开头的请求;" 和 ' 是为兼容 URL 编码后的引号(少见但存在)。
验证是否生效:别只靠浏览器,要看响应头和日志
改完配置重启 Apache 后,仅打开 http://localhost/myapp/.git/config 看是否 403 还不够——要确认 Apache 真的拒绝了,而不是返回空页或重定向。
推荐两步验证:
- 用
curl -I http://localhost/myapp/.git/config查看响应头,确认含Status: 403 Forbidden - 查 Apache 错误日志(
C:\xampp\apache\logs\error.log),搜索.git,确认没有File does not exist(说明规则没命中)或client denied by server configuration(说明已生效)
最容易被忽略的是:规则写在了错误的 <directory></directory> 块里,或被更高层的 AllowOverride All + .htaccess 覆盖。此时优先删掉项目里的 .htaccess 单独测试主配置。











