必须配置location ~ /\.env$ { deny all; }禁止web访问.env文件,否则数据库密码、api密钥等敏感信息会在3秒内被扫描器窃取;需转义点号、保留行尾锚定符$,并置于所有location块之前以防覆盖。

直接禁止访问 .env 文件是必须做的,否则暴露后数据库密码、API 密钥全都会被下载走——这不是“可能”,而是扫描器 3 秒内就能干成的事。
location ~ /\.env$ 必须写对正则和位置
最简但有效的配置只有一行:
location ~ /\.env$ { deny all; }
注意三点:
-
~ \.中的点必须转义,写成\.,否则匹配任意字符 -
$必须保留,否则/path/to/env.php这类路径也会被误杀 - 这条规则要放在所有
location ~ \.php$和location /块之前,否则会被覆盖而失效
PHP 执行目录外的 .env 更不能被 Web 访问
如果项目结构是 /var/www/app/(代码含 .env) + /var/www/public/(Web 根目录),那 .env 理论上已不在 Web 可达路径内。但 Nginx 配置一旦出错(比如用 alias 指向了父目录),就可能绕过隔离。所以仍需双重防护:
- 在
server块顶层加location ~ /\.env$ { deny all; } - 同时确保
root或alias没有意外指向.env所在目录 - 检查
nginx -t输出,确认没有 warning 提示 location 重叠或优先级异常
禁止访问其他敏感文件类型要一并处理
.env 往往不是孤例,.env.example、.env.local、composer.json、package.json 同样高危。推荐合并拦截:
location ~ /\.(env|env\.example|env\.local|json|yml|yaml|lock)$ { deny all; }
说明:
- 括号内用
|分隔,注意.要转义,env\.example才能精确匹配文件名 - 不加
^/前缀,因为正则匹配的是 URI 路径末尾,不是绝对路径 - 避免用
if (-f $request_filename)判断文件存在再 deny —— Nginx 官方明确不建议在 location 外用 if,易引发逻辑错误
别依赖 phpdotenv 自身做防护
很多人以为用了 vlucas/phpdotenv 就安全了,其实完全相反:它只是读取文件的工具,不提供任何访问控制。更危险的是,如果 .env 放在 Web 根目录下,且没配 Nginx 规则,用户直接请求 https://yoursite.com/.env 就能下载全部明文密钥。
真正关键的防线只有两个:
- Nginx 层的
deny all规则(必须生效) - 部署时把
.env移出 Web 根目录(推荐做法)
这两条缺一不可。只做其一,等于门锁了但窗大开。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











