站内搜索表单提交到 /search,服务端处理完再 302 跳到 /search?q=关键词,必应收录的那一版页面正文是空的,只有一句正在跳转,标题却带着用户输入的词。

原因不止一个,得分开看。先处理再跳转的老写法把查询逻辑放在 POST 分支,GET 分支只剩下壳页面;跳转响应没有带 noindex,蜘蛛把中间页当成了正式页面;搜索结果模板把 query 直接回填进标题,拼接出来的标题成千上万条;内链里混进了搜索地址,站外转载又把跳转地址抄了过去。

上来先看搜索结果页返回的状态码与响应体长度

curl -sI 'https://www.lu0.cn/search?q=nginx'

随后把搜索入口改成 GET 直达结果,去掉 302

location = /search { return 301 /search/?q=$arg_q; }

给结果模板加 noindex 并统一 canonical 到首页

剩下的就是用 robots 屏蔽搜索路径后提交移除

Disallow: /search

别只看报错消失,验证要多做一步。两周后 site 查询里带 q= 的结果清零,搜索页请求在日志里仍然存在但状态码稳定为 200 加 noindex。

提醒一点。只加 noindex 不清理已经进索引的地址没用,得在网址移除里主动提交,否则这些页面会挂在索引里半年。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189