nginx server块中通过map+if拦截空host、异常ua、危险路径等静态特征,配合limit_req限流扫描行为,default_server兜底拦截非法请求,并清理危险请求头与参数。

在 Nginx 的 server 块中过滤并丢弃无效垃圾请求,核心是“早识别、快拦截、不转发”——所有动作必须在 proxy_pass 之前完成,且优先利用 Nginx 原生模块(如 map、if、limit_req)做轻量级判断,避免让恶意流量抵达后端。
用 map + if 拦截典型垃圾特征
比 if 单独匹配更高效、更安全。适合过滤空 Host、异常 UA、缺失 Referer、危险路径等静态特征:
- 在
http块顶部定义:
map $host $invalid_host { default 0; "" 1; }
map $http_user_agent $bad_ua { default 0; "~*^(curl|python-requests|Go-http-client|masscan|nmap)" 1; }
map $request_uri $dangerous_path { default 0; "~*\.\./" 1; "~*/\.git/|/\.env|/phpmyadmin/" 1; } - 在
server块中统一拦截:
if ($invalid_host = 1) { return 444; }
if ($bad_ua = 1) { return 444; }
if ($dangerous_path = 1) { return 403; }
对高频扫描行为限流+静默关闭
单 IP 短时间扫大量 404 路径(如 /wp-admin/、/api/login)是典型垃圾流量。用 limit_req 控制节奏,配合 return 444 减少响应开销:
- 在
http块中定义限流区域:
limit_req_zone $binary_remote_addr$uri zone=scan:10m rate=3r/m; - 在
server块中针对高危路径启用:
location ~ ^/(wp-admin|phpmyadmin|\.git|api/.*login) {
limit_req zone=scan burst=2 nodelay;
return 444;
}
强制 Host 校验 + default_server 兜底拦截
95% 的自动化工具(尤其是 IoT 僵尸网络)会发 HTTP/1.0 请求且省略 Host 头,或直连 IP 地址。这两类请求应被第一时间掐断:
- 在主
server块中加:
if ($host = "") { return 444; } - 单独配一个
default_server拦截所有未命中server_name的请求(含非法协议、伪造 Host、SNI 不匹配等):
server {
listen 80 default_server;
listen 443 ssl default_server;
ssl_certificate /path/to/default.crt;
ssl_certificate_key /path/to/default.key;
return 444;
}
清理并标准化请求头与参数
丢弃无意义或危险的输入,防止后端误解析:
- 剥离调试参数:
if ($args ~ "(^|&)debug=|test=|dev=|mock=") { rewrite ^(.*)$ $1? permanent; } - 禁止危险头部透传(防伪造):
proxy_set_header X-Forwarded-For ""; # 由 Nginx 自设真实 IP
proxy_set_header X-Real-IP $remote_addr; - 重写畸形 URI(如大小写混用、多余编码):
rewrite ^/(.*)$ /$1 break; # 强制小写可配合 perl 或 lua 模块











