先给结论:多层缓存下同一URL返回不同版本,通常不是重定向规则本身写错,而是各层缓存对“缓存键”和“重定向响应是否可缓存”的判断不一致。定位时不要反复刷新页面猜结果,而应固定一个入口URL,逐层记录状态码、Location头和缓存命中标记,找到第一处与预期不符的层,再决定是清缓存、改规则还是调整缓存策略。
多层缓存一般包括浏览器缓存、CDN边缘节点、反向代理或应用层缓存。不同版本可能表现为:有的返回301,有的返回302;有的跳到新地址,有的仍停在旧地址;有的带查询参数,有的被剥掉参数。判断依据是差异是否随请求头、Cookie、地区或参数变化而稳定复现。
两种条件的处理方向不同:前者要统一缓存键或让重定向响应绕过缓存;后者要收敛规则来源,只保留一处权威配置。
选一个仍然有价值、需要保留的旧URL作为测试入口,不要用首页。用命令行固定请求头和参数,连续请求同一地址,观察每一跳:
Location、Cache-Control、Age、X-Cache一类命中标记。Location指向的下一跳重复同样记录,直到到达最终页面。这个动作的结果决定下一步:如果分歧出现在边缘节点,优先检查该层的缓存键与TTL;如果分歧出现在反向代理,检查它是否缓存了带Location的响应;如果每一层单独看都稳定,但组合起来不稳定,说明是层间过期时间不同步。
永久重定向和临时重定向的缓存含义不同。把两者混在同一套缓存策略里,是不同版本反复出现的常见原因。
实施动作:在权威配置里明确每个旧URL使用哪种状态码,并让CDN与反向代理对该响应的缓存策略与状态码语义一致。例外是:如果旧地址承载登录态或个性化跳转,不要让它进入共享缓存,否则不同用户可能拿到彼此的跳转结果。
多层缓存返回不同版本,有时根源是重定向规则同时存在于边缘配置、Web服务器配置和应用路由中。三处规则只要有一处条件更宽或更窄,就会在不同层产生不同结果。
可执行的做法是:指定一层为唯一权威来源,其余层只做透传或明确不处理重定向;把旧URL清单与新目标整理成一份可核对的映射,部署后按映射逐条验证,而不是只抽查首页。验证时记录每条的实际状态码和目标,发现某条与映射不符,先查它是否被更宽泛的通配规则提前拦截。
旧内容、旧系统或旧合作关系退出时,不必把所有旧URL都指向同一新页面。保留仍有价值的部分,通常有两种选择:
假设一个旧活动页已下线,但其中某个介绍页仍有参考价值:把活动页指向新活动总览,把介绍页保留或指向对应说明页。部署后分别请求这两个地址,确认它们返回的状态码与目标不同且各自稳定。若两者被同一通配规则捕获,就回到规则来源收敛这一步。
最后提醒:抓取限制配置不等于可靠的移除手段,站点地图也不保证收录;这些信号不能用来替代对重定向一致性的逐层验证。定位多层缓存差异,关键始终是固定请求、逐层记录、找到第一处分歧,再按状态码语义和规则来源做取舍。