nginx server块中应分层控制搜索引擎蜘蛛:用map预识别爬虫类型并统一管理ua判断;对合法蜘蛛限速(如3r/s+burst=8)而非封禁;对恶意ua设极低速率(0.1r/s);按ua重写路径、删减html冗余内容、关闭etag、强化robots.txt动态返回及x-robots-tag头。

在 Nginx 的 server 块中实现对特定搜索引擎蜘蛛的访问控制,核心不是简单封禁或放行,而是分层响应:识别真伪、区别限流、优化内容交付、强化协议协同。关键在于避免用 if + return 403 粗暴拦截,而应结合 map、limit_req、location 精准路由与响应头干预。
用 map 预识别爬虫类型,统一管理 UA 判断逻辑
把 UA 匹配规则集中到 server 块顶部(不在 location 内),提升可读性与执行确定性:
- 定义变量标识主流合法爬虫:
map $http_user_agent $is_legit_spider {<br> default 0;<br> ~*Googlebot 1;<br> ~*Baiduspider 1;<br> ~*bingbot 1;<br> ~*YandexBot 1;<br>} - 再定义恶意或低价值爬虫变量(如 AhrefsBot、SemrushBot),用于后续限速或拦截
- 注意顺序:正则匹配按书写顺序生效,更具体的 UA 规则要写在泛化规则(如
~*curl)之前
对合法蜘蛛限速而非封禁,保障收录稳定性
搜索引擎需要一定并发抓取能力,突然返回 403 或 503 易被判定为服务异常,导致降权:
- 在
server块中声明限速区域:limit_req_zone $is_legit_spider zone=spider_ok:10m rate=3r/s; - 在
location /中启用平滑限流:limit_req zone=spider_ok burst=8 nodelay;
其中burst=8允许短时突发请求,nodelay避免排队超时,实测可减少 499 连接中断 - 对已确认的恶意 UA(如扫描器),可用独立 zone 设置极低速率,例如
rate=0.1r/s,等效于事实封禁
按爬虫类型提供差异化响应与资源路径
不靠后端判断,直接在 Nginx 层优化交付效率:
- 为 Googlebot-Mobile 等移动端爬虫重写静态资源路径:
if ($http_user_agent ~* "Googlebot-Mobile") {<br> rewrite ^(/static/.+\.(js|css))$ /static/mobile/$1 break;<br>} - 移除冗余内容:用
sub_filter在 HTML 响应中删减非索引必需区块(广告、统计脚本),只保留<title></title>、<meta name="description">、application/ld+json - 关闭 ETag 和 Last-Modified 头,改用固定缓存策略:
etag off;<br>add_header Cache-Control "public, max-age=3600";
强化 robots.txt 协同与头部声明,补足协议短板
robots.txt 是君子协议,必须配合 Nginx 层强制控制才能防绕过:
- 精确匹配并动态返回:
location = /robots.txt {<br> default_type text/plain;<br> add_header Content-Type "text/plain; charset=UTF-8";<br> return 200 "User-Agent: Baiduspider\nDisallow: /admin/\nUser-Agent: *\nDisallow: /";<br>}
注意:每条User-Agent必须单独成块,且按“具体→泛化”顺序排列 - 对含
noindex的页面路径,统一注入响应头:location ~ ^/(private|draft)/ {<br> add_header X-Robots-Tag "noindex, nofollow";<br>} - 为
/sitemap.xml启用静态压缩与长缓存:location = /sitemap.xml {<br> gzip_static on;<br> expires 1h;<br>}











