本文约 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 补上重定向。
常见踩坑
- 把所有失效 URL 重定向到首页。 会被判为软 404,权重无法传递,等同于没有做重定向。
- 用了 302 或 JS 跳转。 JS 跳转(
window.location)和 meta refresh 搜索引擎可能不跟随权重。必须 301。 - 改版前没抓全旧 URL。 等新版上线后旧 URL 列表就不完整了,抓取这一步必须在旧站还在线时完成。
- 重定向链过长。
A → B → C应该直接写成A → C。用curl -IL检查跳转链:
bash
curl -sIL https://www.mimangfei.com/about.html | grep -iE '^(HTTP/|location:)'
- 忘了保留 301 规则就删掉。 至少要保留 6 个月,百度完成权重转移通常需要 1–3 个月。
- 站内链接没更新,全靠重定向。 每次点击都多一次跳转,影响速度,也不利于搜索引擎理解新结构。
- 换了域名但没处理外链。 外链指向旧域名,只能靠 301 传递,能联系上的重要外链应主动请对方更新。
- 案例:一次改版导致流量腰斩的事故。 客户把织梦站改版为 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 应逐步恢复索引。改版前记得先做一次完整备份(参考 网站数据备份策略),并且全程保留可回滚的方案。
