搜索全站
建站 16 分钟阅读

网站改版不丢收录:URL 映射与 301 重定向的完整操作流程

改版后收录暴跌、流量腰斩?本文给出完整的 URL 映射流程:旧 URL 全量抓取、新旧映射表设计、Nginx 与 Redirection 两套 301 方案、改版后收录监控与死链处理。

U
UFO_PF 2026-04-09 · 阅读 16 分钟
网站 建站
阅读提示
本文约 6,235 字,预计阅读 16 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:改版上线那天,流量开始自由落体

网站改版的典型剧本是这样的:新版设计更漂亮、结构更合理,开发测试都通过,上线后团队庆祝。然后一周后开始不对劲——百度收录从 3000 条掉到 800 条,Google Search Console 里的”已编入索引”从 1200 掉到 200,自然搜索流量腰斩,而且三个月都没恢复。

原因几乎总是同一个:旧 URL 全部失效返回 404,搜索引擎积累的页面权重无法传递,收录被逐步清理。 搜索引擎看待改版的态度很明确——URL 就是页面的身份证,URL 变了等于页面换了个新身份,之前积累的外链权重、点击数据、抓取频次都无法继承。唯一的解决办法是 301 永久重定向,把旧 URL 的权重显式传递给新 URL。

更麻烦的是,很多改版项目在上线前压根没想过这回事,等发现问题时旧 URL 列表已经拿不全了,只能靠记忆和存档拼凑。

原理分析:301 传递权重,但要满足前提条件

301 与 302 的区别。 301 是永久重定向,搜索引擎会把旧 URL 的权重(PageRank / 百度权重)传递给新 URL,并在索引中用新 URL 替换旧 URL;302 是临时重定向,搜索引擎会保留旧 URL 的索引,权重不传递。改版必须用 301。

重定向链要短。 理想状态是”旧 URL → 新 URL”一步到位。如果形成 A → B → C 的多级链条,搜索引擎可能在中途停止跟随,且每次跳转都增加延迟。更糟的是循环重定向(A → B → A),会导致页面完全无法访问。

权重传递不是 100%。 Google 官方已确认 301 传递的 PageRank 与 302 等价(即基本全量传递),但百度的表现不同,通常需要 1–3 个月才能完成权重的重新计算,期间会有波动。所以改版后要保留 301 规则至少 6 个月,不要看到收录恢复了就删掉。

URL 变化程度决定风险等级:

改版类型 风险 典型表现 应对重点
只换主题,URL 不变 低 几乎无波动 检查内链与结构化数据
目录结构调整 中 部分页面 404 逐条映射 + 规则重定向
域名更换 高 收录大幅波动 全站 301 + GSC 改址工具 + 外链替换
换 CMS(如织梦转 WordPress) 高 收录重建 保持 URL 规则一致,不一致则全量映射
HTTP → HTTPS 中低 短期波动 全站 301 + 替换站内资源链接

一个容易被忽略的点:改版后旧 URL 的”外链”才是真正的资产。 站内链接你可以随便改,但别人网站指向你的链接你改不了。所以映射表的优先级应该按”外链数量 + 历史流量”排序,先处理高价值页面,长尾页面可以用规则批量处理。

保姆级实操:七步完成无损改版

步骤 1:改版前全量抓取旧站 URL。 这一步必须在旧站还在线的时候做,是后面所有工作的地基:

# 方式一:从搜索引擎导出(最贴近真实收录)
# 百度站长平台 → 资源提交 → 已收录列表,导出
# Google Search Console → 网页 → 已编入索引的网页,导出 CSV

# 方式二:从站点地图抓取
curl -s https://旧站.com/sitemap.xml | grep -oP '(?<=<loc>)[^<]+' > old_urls.txt
curl -s https://旧站.com/sitemap_index.xml | grep -oP '(?<=<loc>)[^<]+'

# 方式三:从 Nginx 日志里提取真实被访问的 URL(覆盖搜索引擎未收录但有外链的页面)
awk '{print $7}' /var/log/nginx/access.log \
  | grep -vE '\.(css|js|jpg|jpeg|png|gif|webp|ico|woff2?|svg)$' \
  | sort -u > accessed_urls.txt

# 方式四:WordPress 可以用 WP-CLI 导出所有文章与页面的 URL
wp post list --post_type=post,page --field=url --posts_per_page=-1 > wp_urls.txt

把四个来源合并去重,得到一份”旧 URL 全集”,通常几百到几千条。

步骤 2:建立新旧 URL 映射表。 用表格逐条对应,这是整个改版里最耗时但最值得的一步:

旧 URL 新 URL 类型 外链数 月均流量 优先级
/about.html /about/ 页面改版 45 320 高
/news/123.html /news/wordpress-backup/ 文章 12 180 高
/product/list.php?cid=3 /products/wordpress-plugins/ 带参数 8 90 中
/tag.php?/seo/ /tag/seo/ 标签 2 30 低
/2015/old-post.html 删除 无对应内容 0 0 删除页

映射原则:

  • 内容有对应的新页面 → 301 到该页面;
  • 内容永久删除且无替代 → 返回 410(Gone),比 404 更明确地告诉搜索引擎”这个页面没了,请删除索引”;
  • 内容合并(多页合并成一页)→ 全部 301 到合并后的页面,不要指向首页;
  • 不要把所有失效 URL 都指向首页,搜索引擎会判定为”软 404″,效果接近于没有重定向。

步骤 3:在测试站上完成新版部署与映射验证。 正式切换前,先把新版部署到临时域名,用 curl 批量验证映射规则是否已经生效:

# 批量检查一批 URL 的返回码
while read -r url; do
  code=$(curl -s -o /dev/null -w '%{http_code}' -I "$url")
  echo "$code  $url"
done < test_urls.txt | sort | uniq -c | sort -rn

步骤 4:配置 Nginx 的 301 规则。 有规律的批量 URL 用 map 模块,比写几十条 location 高效得多:

# /etc/nginx/conf.d/redirect.conf

# 少量精确映射:用 map 建立旧 URI → 新 URI 的映射表
map $request_uri $new_uri {
    default                "";
    /about.html            /about/;
    /contact.html          /contact/;
    /news/123.html         /news/wordpress-backup/;
    /product/list.php      /products/;
}

server {
    listen 443 ssl;
    http2 on;
    server_name www.mimangfei.com;

    # 1. 先处理带参数的动态 URL(map 默认不匹配 query string,需单独判断)
    if ($args ~* "^cid=3$") {
        return 301 https://www.mimangfei.com/products/wordpress-plugins/?;
    }

    # 2. 精确映射表命中则跳转(? 用于丢弃原有 query string)
    if ($new_uri != "") {
        return 301 https://www.mimangfei.com$new_uri?;
    }

    # 3. 规则类重定向:旧目录 /news/数字.html → 新目录 /news/文章别名/
    rewrite ^/news/(\d+)\.html$ /news/ permanent;

    # 4. 旧站静态页 .html 后缀统一去掉
    rewrite ^/(.+)\.html$ /$1/ permanent;

    # 5. 标签页参数化 URL
    rewrite ^/tag\.php$ /tag/ permanent;

    # 其余正常处理
    location / { try_files $uri $uri/ /index.php?$args; }
}

关键细节:return 301 ...? 末尾的问号用于丢弃原始 query string,否则 /news/123.html?from=weibo 会跳到 /news/wordpress-backup/?from=weibo,虽然通常无害,但会产生大量带参数的重复 URL。

改完必须检查:sudo nginx -t 通过后再 sudo systemctl reload nginx。

步骤 5:用 Redirection 插件管理不规则的零散跳转。 对于几百条无规律的映射,写在 Nginx 里会让配置文件变得难以维护。WordPress 生态里最常用的插件是 Redirection(作者 John Godley),它支持:

  • 批量导入 CSV 映射表;
  • 自动记录 404 错误,把”改版后仍被访问的失效 URL”直接转成重定向规则;
  • 支持正则与参数传递;
  • 分组管理与点击统计。

导入 CSV 的格式:

source,target,regex,code,group
/about.html,/about/,0,301,改版映射
/contact.html,/contact/,0,301,改版映射
/news/([0-9]+)\.html,/news/,1,301,改版规则
/tag\.php,/tag/,1,301,改版规则

也可以用 WP-CLI 直接操作数据库批量插入,适合上千条的场景:

# 安装并激活 Redirection
wp plugin install redirection --activate

# 批量插入重定向(示例:从 CSV 逐行调用 wp eval)
wp eval-file /opt/scripts/import_redirects.php

注意:插件方案会在每次请求时额外查一次数据库,规则上千条时会有性能开销。规则超过 500 条建议用 Nginx map,或者两者结合——高流量规则放 Nginx,长尾规则放插件。

步骤 6:更新站内链接与站点地图。 重定向只是兜底,站内链接应该直接指向新 URL:

# 替换文章内容中的旧域名与旧路径
wp search-replace 'https://旧站.com/news/' 'https://www.mimangfei.com/news/' --precise
wp search-replace '/about.html' '/about/' wp_posts --precise

# 刷新固定链接规则(改版后必做,否则新 URL 全是 404)
wp rewrite flush --hard

# 重新生成站点地图(以 Rank Math / Yoast 为例)
wp cron event run rank_math/cron/sitemap_generation

步骤 7:向搜索引擎提交变更并监控 90 天。

  • 百度站长平台:提交新版 sitemap,使用”网站改版”工具(规则改版 / 站点改版),提交新旧 URL 规则;
  • Google Search Console:提交新 sitemap;如换域名,使用”地址更改”工具;
  • 用前述监控手段每天检查首页与关键栏目页的可用性;
  • 每周检查 GSC 的”网页”报告,看 404 与”已抓取但未编入索引”的变化;
  • Redirection 插件的 404 日志每周看一次,把高频 404 补上重定向。

常见踩坑

  1. 把所有失效 URL 重定向到首页。 会被判为软 404,权重无法传递,等同于没有做重定向。
  2. 用了 302 或 JS 跳转。 JS 跳转(window.location)和 meta refresh 搜索引擎可能不跟随权重。必须 301。
  3. 改版前没抓全旧 URL。 等新版上线后旧 URL 列表就不完整了,抓取这一步必须在旧站还在线时完成。
  4. 重定向链过长。 A → B → C 应该直接写成 A → C。用 curl -IL 检查跳转链:

bash
curl -sIL https://www.mimangfei.com/about.html | grep -iE '^(HTTP/|location:)'

  1. 忘了保留 301 规则就删掉。 至少要保留 6 个月,百度完成权重转移通常需要 1–3 个月。
  2. 站内链接没更新,全靠重定向。 每次点击都多一次跳转,影响速度,也不利于搜索引擎理解新结构。
  3. 换了域名但没处理外链。 外链指向旧域名,只能靠 301 传递,能联系上的重要外链应主动请对方更新。
  4. 案例:一次改版导致流量腰斩的事故。 客户把织梦站改版为 WordPress,设计师重新设计了 URL 结构,从 /plus/view.php?aid=123 改成 /news/123.html,但开发团队认为”反正会有 301″就没做映射,只在 Nginx 里写了一条”所有 .php 结尾的请求重定向到首页”的规则。上线后百度收录从 2800 掉到 600,且三个月后才恢复到 1500。复盘发现两个问题:一是所有旧 URL 都指向首页形成软 404;二是旧 URL 带 ?aid= 参数,rewrite 规则默认不匹配 query string,实际跳转根本没生效。教训:带参数的旧 URL 必须单独处理,且改版上线前要用 curl -I 抽样验证至少 20 条高价值 URL 的跳转结果。 同类问题在 织梦迁移到 WordPress 和 静态 HTML 迁移到 WordPress 里也会遇到。

总结

改版不丢收录的核心是一句话:旧 URL 必须有明确去处,且去处必须是内容对应的新页面。 执行顺序:改版前全量抓取旧 URL(四个来源合并)→ 按外链与流量排优先级建映射表 → Nginx map 处理规则类 + Redirection 处理零散类 → curl -I 抽样验证 → 更新站内链接与 sitemap → 提交搜索引擎 → 监控 90 天。判断标准是:改版后一个月内,GSC 的 404 数量应持续下降,原收录页面的新 URL 应逐步恢复索引。改版前记得先做一次完整备份(参考 网站数据备份策略),并且全程保留可回滚的方案。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。