nginx 限制特定文件访问需用 location 匹配路径或后缀,配合 deny all 或 return 404 拒绝请求;关键在于阻止静态响应而非系统权限控制;按后缀批量禁止(如 .env、.log)用 location ~* .(env|ini|log|conf|bak|swp|yml|yaml|gitignore)$ { deny all; },精确禁止单文件用 location = /.env,禁目录用 location ^~ /.git/;防 php 源码泄露需加 location ^~ /.php { return 404; } 并确保主 php 块配置完整;修改后须 nginx -t 验证并 reload,用 curl 测试返回 403/404,且 root 和 alias 配置须安全防遍历。

在 Nginx 中限制特定文件的访问,核心是用 location 指令匹配路径或后缀,再配合 deny all 或 return 404 主动拒绝请求。关键不在“权限控制”,而在于“不让文件被当作静态资源返回”——Nginx 本身不读取系统文件权限,它只按配置决定是否响应。
按文件后缀批量禁止
适用于 .env、.log、.conf 等常见敏感扩展名:
- 规则必须写在
server块内,且建议放在所有功能性 location(如 PHP 处理块)之后,避免被覆盖 - 使用
~*实现大小写不敏感匹配,竖线|分隔多个后缀 - 示例配置:
location ~* \.(env|ini|log|conf|bak|swp|yml|yaml|gitignore)$ {
deny all;
}
注意:该规则只匹配 URI 后缀,不检查文件真实内容;/config.php.bak 会被拦截,但 /config.php?backup=1 不受影响(由后端处理)。
精确禁止单个文件或目录
对关键文件(如 .git/config、/admin/index.html)做高优先级拦截:
- 用
location = /path/file精确匹配单个文件(如location = /.env) - 用
location ^~ /path/前缀匹配整个目录(如location ^~ /.git/),比正则优先级高,且不区分大小写 - 避免用
~ /\.git这类正则,可能漏掉/.Git/或嵌套路径
防止 PHP 源码泄露
直接请求 /config.php 时,若未正确配置 PHP 处理,Nginx 可能把它当静态文件返回源码——此时 deny all 不生效:
- 加一层前缀匹配拦截畸形路径:
location ^~ /.php { return 404; } - 确保主 PHP 处理块用
location ~ \.php$,且try_files或fastcgi_pass配置完整 - 不依赖后缀判断,而是靠路径特征(如
/.phpinfo)提前截断
验证与收尾要点
- 修改后必须执行
nginx -t检查语法,再nginx -s reload平滑重载 - 用 curl 测试真实路径:
curl -I http://example.com/.env应返回 403 或 404,不能是 200 - 确认
root指向安全目录(如/var/www/html),不指向/或上级目录,避免 alias 引发路径遍历 - 禁用
autoindex on,防止目录列表暴露文件名











