站点从 Apache 换到 Nginx,原来的 .htaccess 里几十条 Redirect 和 RewriteRule 没转,伪静态能跑但老地址全部 404,日志里一天出现五千条。

把日志和配置对完,能解释这个现象的基本就这几处。Nginx 不读 .htaccess,规则必须写进 server 段。还有一种是原来的 RewriteRule 依赖 per-directory 上下文,路径前不带斜杠。

少数情况下是部分规则用了 Apache 的 RewriteCond 变量,Nginx 里对应写法不同。

动手时先把旧规则列出来逐条对照

grep -nE "Redirect|RewriteRule" .htaccess | head -20

接着改写成 Nginx 的 rewrite 形式

rewrite ^/old-category/(.*)$ /category/$1 permanent;

剩下的就是验证配置语法并重载

nginx -t && nginx -s reload

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改完先别撤,确认这几项。抽查的旧地址全部返回 301 且指向正确,日志里 404 数量回落到改版前水平,nginx -t 无报错。

转换时注意 rewrite 结尾的 permanent 与 last 区别,用错会让后续规则一起跳过。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189