改版之后旧链接是能跳转了,可栏目页和搜索结果页也一起跳回首页,用户不管点哪个入口,最后都落在同一个地址上。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
location ~ ^/old/(?<p>.+)$ {
return 301 https://www.example.com/$p;
}
# 兜底改成 return 404;
跳转用一条正则把整段路径全部吞掉,只保留了域名那一部分,凡是没匹配上的请求就全落到最后那条兜底 301 上,看着省事,实际误伤最多。这一点先确认清楚,后面就不用反复试。
「301 规则过宽」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,把最后那条兜底的规则从 301 直接改成 404,先把误跳的情况止住;逐条列出线上真实还在用的旧路径前缀,一条一条对着日志核对;每条规则都用 ^ 和 $ 卡住开头和结尾,别让路径中间的片段也命中。
改完照着核一遍,栏目页和搜索页都返回 200,只有真实存在的旧路径才会发生跳转。
