论坛的站内搜索地址是 /search?q=关键词,canonical 由通用布局统一输出成当前地址,等于每个搜索页都自称规范页。robots 里也没挡,三个月后索引量从 8 千涨到 8 万,其中七万条是搜索页,日志里搜索页占掉四成抓取预算。加过 noindex,被 CDN 缓存住没生效,反而更乱。
一开始怀疑是「搜索页内部互链,蜘蛛顺着结果互相爬,发现路径没有尽头」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。canonical 直接用当前 URL 生成,搜索页自己承认自己是规范页。也可能是noindex 只写在模板里,页面被 CDN 缓存后蜘蛛拿到的是旧 HTML。
还有一种情况,搜索结果分页没有上限,page=200 之后仍然返回 200。
上来先确认搜索页的响应头和 canonical
curl -sI 'https://www.example.com/search?q=nginx' | grep -i -E 'x-robots|cache-control'
然后用响应头兜住 noindex 并排除缓存
location /search { add_header X-Robots-Tag "noindex, nofollow" always; add_header Cache-Control "no-store" always; }
随后统计搜索页占用的抓取比例
grep -c 'GET /search?q=' /var/log/nginx/access.log
给搜索结果分页加硬上限
if ( $arg_page ~ ^([2-9][0-9]|[0-9]{3,})$ ) { return 404; }
改完先别撤,确认这几项。搜索页响应头同时带 noindex 与 no-store,两周后 GSC 里搜索页条目减少一半,日志中搜索页抓取占比从四成降到一成以内。
这里还有个坑。模板 noindex 和响应头 noindex 作用范围不同,一个跟着 HTML 走,一个不依赖缓存,重复内容多的页面最好两个都给。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
