核心是前置拦截敏感路径:先用 location ~ /. { deny all; } 屏蔽点文件,再用 location = /.env { return 404; } 精确封禁高危单文件,接着用 location ^~ /config/ { deny all; } 封禁整目录,最后用 location ~*.(env|ini|log|bak|sh|sql|yml|yaml|swp|swo)$ { return 404; } 批量阻断危险后缀。

核心是让敏感路径根本匹配不到,而不是等请求进来再处理。所有拦截规则必须放在 server 块最前面,确保优先执行,不被后续 location 覆盖。
统一屏蔽所有以点开头的路径
像 .env、.git、.htaccess 这类文件有共同特征:名字以 . 开头。一条正则就能全覆盖:
location ~ /\. { deny all; }- 必须写在
location /和其他通用规则之前 - 加上
access_log off;和log_not_found off;,避免日志被刷爆
精确拦截高危单文件
对泄露即失守的文件(如 /.env、/wp-config.php),不能靠模糊匹配,要杜绝歧义:
-
location = /.env { return 404; }—— 只拦根目录下完整路径,不连带影响/public/.env.example -
location = /wp-config.php { deny all; }—— 返回 403 更明确 - 避免写
location ~ \.env,它会误杀合法路径中的子串
前缀匹配保护整目录
对 /config/、/admin/、/backup/ 这类需整体封禁的路径,用 ^~ 最稳妥:
-
location ^~ /config/ { deny all; }—— 拒绝该路径及全部子路径 -
location ^~ /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; }—— 比直接拒绝更可控 - 不用
location /config(无修饰符),优先级低,容易被兜底规则覆盖
批量封禁危险后缀并防大小写绕过
备份、日志、配置、脚本类文件是扫描器重点目标,一次性阻断能大幅压缩攻击面:
location ~* \.(env|ini|log|bak|sh|sql|yml|yaml|swp|swo)$ { return 404; }-
~*表示忽略大小写,覆盖.ENV、.SQL等变体 -
$锚定结尾,防止匹配到/config.php.bak这类残留文件











