结论:系统本身没有「旧链接跳转」这类开关,301 得在 Nginx 层写规则,关键是保住参数映射、把新地址末尾的查询串清干净。
① 先把旧链接摸清楚。翻服务器 access.log 或 404 日志,按命中次数排序,把 /index.php?mod=xxx&fid=12 这类老 URL 和现在伪静态生成的新地址一一对上做成映射表,只处理有量级的,长尾最后统一兜底。
② 规则用 $arg_xxx 判断,不要整串正则匹配,这样参数顺序变了也能命中,比如:
if ($arg_mod = forumdisplay) { return 301 /forum-$arg_fid.html?; }
目标地址末尾那个 ? 千万别漏,否则原查询串会被自动带过去,新链接变成 /forum-12.html?mod=forumdisplay&fid=12,自己给自己造重复内容。
③ 顺序和灰度要注意。这些规则必须写在伪静态的 location / try_files 之前,先命中先跳。上线先全部用 302 跑三五天,看日志确认没有跳错再改成 301——301 会被浏览器和 CDN 长期缓存,跳错了很难收回。最后补一条兜底,把没映射上的旧动态链接 301 到对应版块或首页,别留 404 掉权重。
见习用户
正式会员
认证极客






