### 一、基于 IP 访问频率限制
1. **配置示例**:
```nginx
http {
# 定义一个名为 anti_spider_zone 的共享内存区域,用于存储 IP 访问频率信息
limit_req_zone $binary_remote_addr zone=anti_spider_zone:10m rate=10r/s;
server {
location / {
# 对该 location 下的请求应用 IP 访问频率限制
limit_req zone=anti_spider_zone;
proxy_pass http://backend;
}
}
}
- 原理:通过限制每个 IP 地址在单位时间内(这里是每秒 10 次请求)的访问次数,来阻止单个 IP 进行高频请求,正常用户通常不会在短时间内发起大量请求,而爬虫可能会。当某个 IP 的请求频率超过设定值,后续请求将被延迟处理,直至其请求频率降下来。
二、基于用户代理(User-Agent)过滤
- 配置示例:
http {
map $http_user_agent $is_bad_ua {
default 0;
# 这里可以添加常见的爬虫 User-Agent 字符串进行匹配,例如:
"~*python-requests" 1;
"~*scrapy" 1;
}
server {
location / {
if ($is_bad_ua = 1) {
return 403;
}
proxy_pass http://backend;
}
}
}
- 原理:许多爬虫会在请求头中携带特定的 User-Agent 标识。通过建立一个映射表,将常见的爬虫 User-Agent 标记为可疑,当请求的 User-Agent 匹配到这些可疑值时,直接返回 403 Forbidden 状态码,拒绝该请求。
三、基于 Referer 验证
- 配置示例:
http {
server {
location / {
# 只允许来自特定域名的 Referer
if ($http_referer!~* ^https?://(www\.)?yourdomain\.com) {
return 403;
}
proxy_pass http://backend;
}
}
}
- 原理:正常用户通过浏览器访问页面时,通常会有合理的 Referer(前一个页面的地址)。而爬虫可能没有正确设置 Referer 或者其 Referer 不符合正常的页面跳转逻辑。通过验证 Referer 是否来自合法的域名,可以过滤掉一部分异常请求。
四、验证码挑战
- 配置示例:
http {
server {
location / {
# 当某个条件触发(如 IP 访问次数达到一定阈值但未超过封禁标准)时,重定向到验证码页面
if ($request_uri = "/captcha.html") {
# 显示验证码页面
root /var/www/html;
break;
}
if ($bad_visitor = 1) {
rewrite ^(.*)$ /captcha.html break;
}
proxy_pass http://backend;
}
}
}
- 原理:当 Nginx 根据前面的规则判断某个访问者有一定的爬虫嫌疑(如 IP 访问频率较高但未确定为恶意爬虫)时,将其重定向到一个验证码页面。只有用户成功输入验证码后,才允许继续访问后续页面,这样可以有效区分正常用户和自动化的爬虫程序,因为爬虫通常难以自动识别和输入验证码。
五、封禁恶意 IP
- 配置示例:
http {
geo $bad_ip {
default 0;
# 这里可以从一个封禁 IP 列表文件中读取要封禁的 IP,例如:
include /etc/nginx/conf.d/bad_ips.list;
}
server {
location / {
if ($bad_ip = 1) {
return 403;
}
proxy_pass http://backend;
}
}
}
-
原理:将那些被确定为恶意爬虫的 IP 地址添加到封禁列表文件中,Nginx 通过
geo
模块读取该列表并将对应的 IP 标记为封禁状态。当这些恶意 IP 再次发起请求时,直接返回 403 拒绝访问,从而彻底阻止它们的访问。在实际应用中,可以根据网站的具体需求和流量情况,灵活组合和调整这些反爬虫策略,以达到最佳的防护效果并尽量减少对正常用户体验的影响。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于