最有效的方式是组合使用三类 location 规则:统一屏蔽点开头路径(如 /.)、精确拦截关键文件(如 = /.env)、前缀匹配保护敏感目录(如 ^~ /config/),并补充封禁危险后缀,确保规则优先级高、防绕过、覆盖常见变体。

最有效的方式是组合使用三类 location 规则:统一屏蔽点开头路径、精确拦截关键文件、前缀匹配保护敏感目录。核心不是“全不全”,而是规则是否优先级足够高、能否防绕过、是否覆盖常见变体。
统一拦截所有以点号开头的路径
像 .git、.env、.htaccess 这类文件都以 . 开头,共性明确,适合一条正则全覆盖:
- 写法:
location ~ /\. { deny all; } - 必须放在
location /和其他通用规则之前,否则可能被提前匹配而失效 - 加
access_log off;和log_not_found off;,避免日志被刷屏
精确匹配根目录下的高危单文件
对 .env、wp-config.php 等泄露即失守的文件,不能只靠模糊匹配:
-
location = /.env { return 404; }——只拦根路径下完整路径,更隐蔽 -
location = /wp-config.php { deny all; }——杜绝歧义,不连带匹配/wp-config.php.bak - 避免写
location ~ \.env,它会误拦/public/.env.example等合法路径
用 ^~ 前缀匹配保护整目录
对 /config/、/storage/logs/、/admin/ 这类需整体封禁的路径,优先用 ^~:
-
location ^~ /config/ { deny all; }——拒绝该路径及全部子路径 -
location ^~ /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; }——比直接拒绝更可控,适合后台入口 - 不用
location /config(无修饰符),它优先级低,容易被location /兜底
补充封禁危险后缀并验证生效
备份、日志、脚本类文件常被扫描器盯上,一次性阻断可大幅降低攻击面:
location ~* \.(env|ini|log|bak|sh|sql|yml|yaml|swp)$ { return 403; }-
~*表示忽略大小写,覆盖.ENV、.SQL等变体 - 重载后测试:
curl -I http://site.com/.env应返回403或404,且响应头不含Server: nginx(确认已设server_tokens off;) - 检查错误日志:
tail -f /var/log/nginx/error.log,确认出现access forbidden by rule











