这个坑值得记一笔。迁移后新站 URL 全部小写,旧站有三千条链接带大写字母,Nginx 的 301 映射区分大小写,这批链接全落 404,外链权重断了一半。

刚开始盯着「新站路由对大小写敏感,大写地址直接 404」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。旧链接大小写混用,映射表只写了一种;Nginx 的 map 默认区分大小写;没有做统一转小写的兜底规则。

先抽样确认大写链接的返回码

curl -s -o /dev/null -w "%{http_code}\n" https://www.example.com/Post-1/

然后用不区分大小写的正则做映射

map $uri $new_uri { ~*^/Post-([0-9]+)/$ /post/$1/; }

补一条兜底重写

rewrite ^(.*[A-Z].*)$ /lowercase$1 last;

复核抽样链接

curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" https://www.example.com/Post-1/

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

这台环境是别人交接的,不少默认值被动过,只能一项项核。

改完先别撤,确认这几项。大写链接 301 到对应的小写地址,抽样 100 条全部命中,404 数量明显回落。

补一句。301 映射要按不区分大小写来写,URL 大小写在 Linux 上就是两个页面。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189