这类问题我又碰上了一次。换域名时在 Nginx 里写了 return 301 https://new.example.com$request_uri,首页正常,内页全部落到新站 404,日志里一堆 /old-path 找不到。
第一反应是「伪静态规则在跳转前被 rewrite 打断,请求落到了 404」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。旧站内页路径比新站多一层目录,直接拼接会拼出不存在的地址;正则 location 写成了精确匹配,只有根路径命中;部分栏目改过名,需要单独的映射表。
动手时先抽样比对一个旧内页的跳转结果
curl -sI https://old.example.com/blog/post/1 | grep -i location
再往下按栏目写分段的跳转规则
rewrite ^/blog/(.*)$ https://new.example.com/article/$1 permanent;
然后用映射表处理改名的栏目
map $uri $new_uri { ~^/old/(.*)$ /new/$1; default $uri; }
批量复验跳转后的状态码
for u in $(head -20 urls.txt); do curl -o /dev/null -s -w '%{http_code} %{url_effective}\n' $u; done
恢复的判定其实很直接。补上按栏目的规则后,抽样的两百条旧地址全部 301 到新站对应页面,内页流量在两周内恢复。
整域跳转只能解决首页,路径结构一变就必须按目录写映射,否则跳过去也是 404。这类问题最好一次改到位,反复小改反而容易把原因搅混。
