禁止特定文件访问的核心是location正则匹配加deny all或return 404,需注意规则位置、php特殊处理及隐藏目录显式封禁。

直接结论:禁止特定文件访问,核心靠 location 正则匹配 + deny all 或 return 404,但必须注意规则位置和 PHP 等动态文件的特殊处理逻辑。
用 location ~* 匹配敏感扩展名并 deny all
这是最常用也最易出错的方式。比如禁止访问 .conf、.log、.env 等文件:
location ~* \.(conf|log|env|bak|swp|yml|yaml|json|xml|htaccess)$ {
deny all;
}
常见错误现象:
- 规则写在
location /之前,被后续更宽泛的location覆盖(Nginx 匹配优先级:精确 > ^~ > 正则) - 没加
~*,导致大小写不敏感失效(如.ENV仍可访问) - 扩展名之间漏了竖线
|,变成字面量匹配(如(conf|log)写成(conflog)就完全失效)
建议放在 server 块末尾、所有功能性 location(如 PHP 处理、静态文件)之后,确保不被绕过。
PHP 文件不能只靠 deny,必须配合 try_files
如果站点跑 PHP,但用户直接请求 /config.php,Nginx 可能把它当静态文件返回源码——deny all 在这种场景下根本不会触发。
正确做法是两层防护:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正常 PHP 执行路径保持原有
fastcgi_pass配置 - 额外加一个高优先级前缀匹配,强制拦截未被 fastcgi 处理的 .php 请求:
location ^~ /.php {
return 404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
注意:^~ /.php 会匹配所有以 /.php 开头的路径(如 /.phpinfo、/.php?x=1),比正则优先级更高,且不进入后续正则匹配,能有效堵住扫描器构造的畸形路径。
隐藏目录和点文件必须显式封禁
Nginx 默认不提供 .git、.svn 目录内容,但不等于它拒绝响应——某些配置下仍可能返回 403 或泄露路径结构。显式拒绝更安全:
location ~ /\. {
deny all;
}
location ~ ^/(.git|.svn|.hg|.project|composer.json|package.json)$ {
deny all;
}
关键细节:
-
~ /\.中的反斜杠是转义点号,否则.是正则通配符 -
^/(.git|...)的^/确保只匹配 URI 根路径下的目录,避免误杀子路径中含.git字样的正常文件 - 这些规则要放在所有通用
location /之前,否则可能被覆盖
禁止目录浏览不是默认安全,必须验证是否真关闭了
很多人以为 Nginx 默认关掉了目录浏览,其实只是没开 autoindex on;但一旦某处误配,整个目录就裸奔了。
检查要点:
- 全局搜索配置里有没有
autoindex on,哪怕只在某个location里出现也不行 - 修改后必须
nginx -t语法校验 +systemctl reload nginx - 实测访问一个无
index.html的空目录(如/uploads/),看返回是 403/404 还是 HTML 文件列表
最容易被忽略的是 include 的子配置文件——比如 /etc/nginx/conf.d/*.conf 里某个人写的测试配置偷偷开了 autoindex on,主配置再严谨也没用。










