最可靠方式是用显式拒绝: Require all denied ,须写入VirtualHost或主配置,路径须完全匹配,且必须重启Apache生效。

Apache怎么禁止访问.git目录
直接在 Apache 配置中用 <directory></directory> 显式拒绝,是最可靠的方式——.git 本身不是 PHP 文件,不会被解析,但若配置疏漏,浏览器仍可能列出或下载其内容(比如 .git/config 暴露远程仓库地址)。
-
<directory> Require all denied </directory>必须写在VirtualHost或主配置里,路径要和实际物理路径完全一致 - 别依赖
FilesMatch "\.git"——它只匹配文件名,对目录无效;Directory才管目录层级 - 如果站点用了宝塔面板,可在【网站】→【设置】→【目录限制访问】中添加路径
/\.git并勾选【禁止访问】,后台会自动生成等效规则 - 改完必须运行
sudo apache2ctl configtest验证语法,再sudo systemctl reload apache2
为什么.env不能只靠FilesMatch拦住
.env 是纯文本文件,Apache 默认不解析它,请求 https://example.com/.env 会直接返回明文内容。很多人只加了 <filesmatch> Require all denied </filesmatch>,却忽略了两个关键点:
- 正则没加锚定:
"\.env$"会误伤myenv.php,应写成"^\.env$"或更稳妥的"\.(env|env\.local)$" - 规则位置错误:如果写在
.htaccess里,而AllowOverride被设为None,整段会被忽略;生产环境建议直接写进VirtualHost - 别忘了备份文件:
.env.bak、.env.example同样危险,正则里一并覆盖:"\.(env|env\.local|env\.bak|env\.example)$"
禁用目录索引只是基础,不是保险
Options -Indexes 只防止用户访问空目录时看到文件列表,比如打开 /config/ 返回 403,但它完全不拦 /config/database.php 或 /.env 这类具体文件请求。
覆盖宏观策略、固收研究、行业公司深度分析、量化因子、大类资产配置、可转债、市场情绪、政策快评、行业景气度追踪等34项核心研究能力,证券研究员的全能数字助手。
- 单独关
Indexes对.git和.env几乎没用,它们不是“空目录”,而是真实存在的文件或子目录 - 真正起作用的是
Require all denied(Apache 2.4+)或Deny from all(2.2),且必须作用于对应路径 - 如果你用的是共享主机、无法改主配置,那
.htaccess是唯一选择,但得确认AllowOverride All已启用,否则规则静默失效
PHP 层面也要防意外加载
Web 服务器拦住了 HTTP 请求,不代表 PHP 脚本就安全了。如果代码里写了 file_get_contents('../.env') 或 require $_GET['file'] . '.php',照样可能读到敏感文件。
立即学习“PHP免费学习笔记(深入)”;
- 用
realpath()校验路径是否落在白名单内:$path = realpath($_GET['file']); if (strpos($path, '/var/www/your-site/') !== 0) die('Access denied'); - 加载配置优先用
symfony/dotenv,它默认不从 Web 可达路径读取,且支持自动跳过注释和空行 - 部署前跑一次
find /var/www/your-site -name ".env" -o -name ".git" | grep -v "vendor",确认没漏掉嵌套子目录里的敏感残留
.env 放在 Web 根目录同级(如 /var/www/myapp/.env),而 DocumentRoot 指向 /var/www/myapp/public ——这种结构下,.env 本身就不在 Web 路径里,根本不需要 Apache 拦截。优先检查目录结构,再动配置。


















