先别改规则。测试工具能访问、真实用户失败,最常见的原因是工具复现的请求条件与真实用户不一致。你要做的不是再点一次测试按钮,而是把真实用户的失败请求还原成一组可重复的条件:来源、路径、协议、Host、Cookie 与缓存状态。只有先让失败在本地稳定出现,后续的 301 重定向设置调整才有判断依据。
测试工具通常只请求一个 URL,然后看返回码和 Location。真实用户却会经历多跳:浏览器补全、CDN 回源、服务端规则、反向代理、应用路由。测试工具看到 301 正常,可能只是它请求的那一跳正常。
把失败请求拆成最小链条:用户输入或点击的原始地址、浏览器实际发出的请求地址、第一跳响应、第二跳响应、最终落地地址。假设一个场景:测试工具请求 https://example.com/old 得到 301 到 /new,而用户从搜索结果进入的是 http://example.com/old/,末尾斜杠和协议都不同。这两条路径可能命中不同规则。动作是逐跳记录,结果是你能看到失败究竟发生在协议跳、斜杠跳还是路径跳,下一步才不至于盲目加规则。
测试工具一般不带 Cookie、不带 Referer、不执行 JavaScript、不会沿用浏览器缓存。真实用户会。以下条件里只要有一个不同,就可能出现“工具正常、用户失败”。
www 或某个别名域,规则只匹配了主域。先按这张表逐项对照,而不是先怀疑服务器。每排除一项,你离可复现条件就近一步。
让遇到问题的用户提供三样东西:完整地址栏内容、失败时的响应状态或错误提示、是否在无痕窗口复现。拿到后不要直接打开浏览器,而是用能自定义请求头的方式重放。
curl -I 或等效方式请求用户给出的完整地址,保留协议、Host、路径和查询串。假设加入 Cookie 后,响应从 301 变成 302 到登录页,说明应用层在重定向之前介入了。此时继续调整 301 重定向设置不会解决问题,应该先处理跳转顺序。这个判断会直接改变你下一步动的是哪一层配置。
如果失败只在部分用户出现,且同一地址在工具里时好时坏,优先怀疑缓存层。可区分的证据包括:响应头里是否出现缓存命中标记、不同地区或不同网络的结果是否不同、清空本地缓存后是否恢复。
需要说明的是,请求量或抓取量归零不能单独证明你的重定向处理正确,它也可能是抓取预算变化、robots.txt 限制或统计口径变化造成的。robots.txt 的抓取限制也不等于可靠的索引移除。判断重定向是否真正服务了用户,仍要回到真实请求链路上验证。
如果证据指向 CDN 缓存了旧跳转,动作是先在缓存层刷新该路径,再让用户复测;结果是若失败消失,说明源站规则本身没错,问题在缓存同步。若仍失败,再回到源站规则排查。这个顺序能避免你把源站规则改乱。
找到遗漏条件后,不要只修当前这一条。把触发失败的组合写进验证清单,每次调整 301 重定向设置后都跑一遍。
清单的价值在于,它把“工具能访问”这个假阳性挡在外面。只有当真实用户条件被纳入验证,301 重定向设置才算真正覆盖了失败场景。先复现,再修改,最后用同一组条件确认失败不再出现。