直接在 server 或 location 块中用 return 302 拦截恶意来源跳转至空页(如 /blank.html 或 204)最简洁高效;推荐结合 geo 指令管理 ip 黑名单,匹配 $http_referer 或 $host 实现盗链与非法域名拦截,并确保 /blank.html 路径不触发二次跳转。

直接在 server 或 location 块中拦截恶意来源,用 return 302 跳转到一个空响应页(比如返回 204 No Content 或一个极简 HTML 页面),是最简洁、高效且可审计的做法。不建议用 rewrite + redirect,因为 return 更轻量、无重写开销,也避免循环风险。
识别并拦截恶意 IP 地址
可通过 if 指令结合 $remote_addr 判断客户端真实 IP(注意:若前端有代理,需确保 real_ip 模块已启用并配置 set_real_ip_from)。
- 单个或少量恶意 IP:用
if ($remote_addr = "192.168.1.100") { return 302 /blank.html; } - 多个 IP:推荐用
geo指令预定义黑名单,更高效(避免 if 多次判断)
geo $bad_ip {
default 0;
192.168.1.100 1;
203.0.113.55 1;
2001:db8::1 1;
}
if ($bad_ip) { return 302 /blank.html; } - 空白页建议用
/blank.html(静态文件),内容仅含;也可直接返回 204:return 204;(更轻,但严格来说不是“302 重定向”,需按需选择)
拦截恶意 Referer 或 Host 域名
针对盗链、爬虫伪造来源或非法子域名请求,可用 $http_referer 或 $host 匹配。
- 屏蔽特定盗链域名:
if ($http_referer ~* (evil-site\.com|spam-bot\.org)) { return 302 /blank.html; } - 限制合法 Host:
if ($host !~ ^(example\.com|www\.example\.com)$) { return 302 /blank.html; } - 注意:正则匹配对性能影响小,但避免在高并发下用过于复杂的模式;
~*表示不区分大小写
确保空白页可访问且不触发新重定向
被重定向的目标路径(如 /blank.html)必须真实存在、权限正确,并且其 location 块不能再次触发跳转逻辑,否则会陷入循环或返回 500。
- 明确声明该路径不参与拦截:
location = /blank.html {
root /usr/share/nginx/html;
internal; # 可选:禁止外部直接请求,只允许内部跳转
} - 如果用 302 跳转到自身或其他路径,务必检查是否满足条件——例如不要让
/blank.html的请求又匹配到前面的 if 规则
验证与调试建议
配置后 reload 前务必测试,避免误杀正常流量。
- 用 curl 模拟恶意请求:
curl -H "Referer: https://evil-site.com" http://your-site.com/test - 检查响应头:
curl -I确认返回302 Found及Location: /blank.html - 查看 error.log:若出现
rewrite or internal redirection cycle,说明跳转路径被重复匹配,需调整 location 或 if 条件范围











