作为 Nginx 屏蔽特定 IP(段)/UA 、使用 Nginx + Cloudflare 阻挡赛博垃圾 以及 使用 referrer-spam-list 处理来源垃圾(Referrer spam) 的补充
用 map 创建请求的黑/白名单
# 屏蔽 cookie
map $http_cookie $badcookie {
default 0;
~*cookie1 1;
}
# 屏蔽路径
map $uri $badlocation {
default 0;
/path1 1;
/path2 1;
}
# 屏蔽请求方法
map $request_method $badmethod {
HEAD 0;
GET 0;
POST 0;
default 1;
}
# 屏蔽 UA
map $http_user_agent $badagent {
default 0;
"" 1;
~*UA1 1;
}
将以上映射分别存储在对应的文件中,然后在 Nginx 的 http 块内引入这些文件
最后就可以在 server 块内使用 if 语句配置屏蔽状态码
server {
# ...
set $flag 0;
if ($badcookie) { set $flag 1; }
if ($badlocation) { set $flag 1; }
if ($badagent) { set $flag 1; }
if ($badmethod) { set $flag 1; }
if ($flag = 1) { return [status code]; }
}
除了屏蔽请求,还可以配置默认 server 块:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 444;
}
- 在 server 块返回 444 状态码,直接中断连接
- 可以在一定程度上防止端口信息扫描
- 在使用了 SSL 的 server 块添加 ssl_reject_handshake on,拒绝握手
- 可以在一定程度上防止端口信息/源站扫描
使用如上 server 配置,会发现访问 IP:443 端口时还是会返回 “HTTP 请求发送到 HTTPS 端口” 的错误
如果不想返回任何信息,可以将配置修改为
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
error_page 497 =444 @close;
location @close {
return 444;
}
return 444;
}
当 497 错误发生时直接返回 444 状态码

