站内搜索结果能一直翻到第 30 页,第 12 页之后返回的内容和第 3 页几乎一样,蜘蛛把这些页都抓了一遍,索引里出现大量重复的结果页。
真正麻烦的地方在于,几个原因的现象几乎一样。搜索接口对超出范围的页码回退到最后一页,没有返回 404。也可能是分页链接没有上限判断,前端直接按总页数渲染。
不容易想到的是,结果页之间没有 canonical 收敛。
动手时先确认越界页码返回的状态码
curl -s -o /dev/null -w '%{http_code}\n' 'https://www.example.com/search?q=seo&page=30'
超出上限直接返回 404
if ($page > 10) { status_header(404); exit; }
给前 10 页之外的链接不再输出
curl -s 'https://www.example.com/search?q=seo' | grep -c 'page='
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
别只看报错消失,验证要多做一步。改完后越界页码返回 404,索引里的结果页数量从六万降到八千,抓取日志中搜索路径请求明显减少。
提醒一点。截断的位置不用追求精确,只要越界不返回 200,重复内容就不会继续堆。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
