在运营网站时,我们经常会遇到各种流氓爬虫、扫描器或不怀好意的工具访问。通常我们会返回 403 Forbidden,但这样做服务器依然要发送响应头。今天分享一个更绝的招数:使用 Nginx 特有的 444 状态码。 它可以直接掐断 TCP 连接,让对方连一个字节的数据都拿不到,真正做到节省带宽、保护资源。
1. 为什么要用 444 而不是 403?
- 403 Forbidden:服务器会返回一个标准的 HTTP 响应(包含 Header 和 Body),对方知道你拒绝了它,且依然消耗了你的微量流量。
- 444 No Response:这是 Nginx 的非标准状态码。它告诉服务器:立即关闭连接。客户端(爬虫)会收到一个“连接已重置”或“无响应”的错误,拿不到 HTML 源码,也就无法解析和请求页面上的 CSS、JS 或图片资源。
2. 核心配置思路
为了高性能和易于维护,我们采用 map 指令定义黑名单,并在站点配置中引用。
第一步:在主配置文件定义“黑洞”
在 Nginx 主配置 nginx.conf 的 http 块中加入以下代码:
include proxy.conf; 下面加
# 恶意 User-Agent 映射表
map $http_user_agent $is_bad_bot {
default 0;
# 屏蔽高频流氓爬虫及扫描工具
"~*AhrefsBot|ClaudeBot|Bytespider|SemrushBot|Nmap|CensysInspect" 1;
# 屏蔽空 User-Agent
"^$" 1;
# 特殊:根据需求可添加 MSIE 或特定浏览器
}第二步:在站点配置中开启拦截
在具体站点的 server 块最顶部加入:
server {
listen 80;
server_name yourdomain.com;
# 命中黑名单直接人间蒸发
if ($is_bad_bot) {
return 444;
}
# 正常业务逻辑...
}3. 实战避坑指南
在配置过程中,有几个关键点需要注意:
- 位置顺序:拦截代码一定要放在
server块的最前面,甚至在 HTTPS 跳转之前,这样可以省下 SSL 握手的资源消耗。 - 误伤检查:如果配置后发现自己也打不开网页,报错
HTTP ERROR 520,请检查黑名单中是否包含mac、MSIE或360SE等关键词,这些词容易误伤正常用户。 - 生效验证:使用命令行测试是最准确的:
curl -I -A "AhrefsBot" https://yourdomain.com如果返回Empty reply from server,说明你的拦截黑洞已经部署成功。
结语
通过 Nginx 的 map 指令和 444 状态码,我们为服务器筑起了一道隐形的防火墙。这不仅保护了站点的外部 CSS 等资源不被浪费,还极大地降低了恶意扫描对服务器性能的影响。
此内容仅对以下用户分组的用户可见:
站长
已有权限?立即刷新
作者:霍欣标,如若转载,请注明出处:https://www.bigengwu.cn/shu/352.html