KernelRanch
返回文章列表

重定向与批量重定向:几千条旧链接怎么搬

2026-11-10 #Cloudflare

读完这篇你能做到:用 _redirects 文件处理站点内的跳转,写对状态码和通配符;改域名或重构 URL 结构时,把几千条旧链接批量搬过去;并且知道 301 一旦被浏览器记住,测试阶段该怎么避免把自己坑住。

重定向是迁移里最容易留下长期债务的一环。规则写错会出现循环跳转,状态码选错会让搜索引擎把权重丢掉,而这两类问题的表现都是"页面打不开",很难一眼看出原因。

1. _redirects 文件

Pages 项目在构建输出目录放一份 _redirects,随产物一起上传,每行一条规则:

/old-post /new-post 301
/docs/* /guides/:splat 301
/blog/:year/:slug /posts/:slug 301
/download https://cdn.example.com/file.zip 302

四列的含义:来源路径、目标路径、状态码(省略时是 302)。来源以 / 开头表示站内路径,目标可以是站内路径,也可以是完整 URL。

三条常用能力:

通配符 * 只能出现在末尾,捕获的部分用 :splat 引用。/docs/* 到 /guides/:splat 会把 /docs/a/b 送到 /guides/a/b。

占位符 :name 匹配单段,可以多个组合。上例把 /blog/2024/hello 送到 /posts/hello。

状态码 200 表示"代理"而不是跳转,浏览器地址栏不变,内容取自目标路径。做路径重写时用它。

2. 额度

免费档每个站点支持 2,000 条静态重定向,外加 100 条带占位符或通配符的动态重定向。静态指两个路径都是写死的字符串。

超过这个量有两条路:改用 Bulk Redirects(账号级,不占站点的 _redirects 额度),或者用 Worker 加 KV 自己查表。后者灵活但要写代码,适合规则会频繁变动的场景。

3. 状态码怎么选

状态码语义用在什么场景
301永久换域名、URL 结构永久改变
302临时活动页、灰度切换
307临时,保留方法表单提交的临时跳转
308永久,保留方法POST 端点永久迁移
200代理重写内容搬家但地址不变

301 会被浏览器长期记住,这是它最大的风险。测试期间用 302,确认无误再改成 301,否则一次错误的 301 会让你的浏览器在几个月里都往错的地方跳,清缓存都不一定管用。

4. 换域名:批量重定向

整站换域名时,规则形态高度一致:旧域名的任意路径跳到新域名的同一路径,保留路径和查询串。

控制台路径在账号级:Bulk Redirects → Create a Bulk Redirect List,然后建规则、导入条目。

最小做法是一条规则加通配:

字段值
Source URLold.example.com
Target URLhttps://new.example.com
保留路径开启
保留查询串开启
状态码301

几千条具体 URL 的映射(比如电商的商品页改版)用 CSV 导入,列是来源、目标、状态码。导入前先在表格里查重,同一来源出现两次时行为取决于顺序,容易出意外。

免费档的 Bulk Redirects 额度有限,条目数以控制台显示的配额为准。数量再大就上 Worker,把映射表放 KV,一个请求查一次。

5. 站内跳转的常见写法

尾斜杠统一。要么全部带,要么全部不带,中间用一条通配规则兜住:

/:path+/ /:path 301

这条会把 /a/b/ 送到 /a/b。反向(补斜杠)也能写,但和框架的 canonical 设置要对齐,否则会互相打回形成循环。

旧栏目整体迁移,用一条规则覆盖:

/2019/* /archive/2019/:splat 301

单篇错别字修正,一条一条列,别用通配,免得误伤。

6. 验证

改完规则立刻验证,别等上线后靠搜索引擎报错发现:

curl -sI https://example.com/old-post | grep -i -E 'HTTP/|location'

期望看到 301 和正确的 Location。再跟一次目标地址,确认它不是又一个 301。连续三次跳转以上,搜索引擎会降低抓取意愿。

循环的典型成因是两条规则互相指向:/a 到 /b,同时 /b 到 /a。把规则按来源排序看一遍就能发现。

和缓存的交互也要注意。301 响应本身会被边缘和浏览器缓存,改完规则后用新路径测试,或者先清一次缓存,做法见 74-cache-rules.md。

常见问题

2,000 条不够用怎么办。

先看是不是能用通配符合并。大量规则往往呈现规律(/p/123 到 /product/123),一条 :id 规则能替掉几千条。合并完仍然不够,走 Bulk Redirects 或 Worker。

_redirects 支持匹配查询串吗。

不支持。规则只匹配路径,查询串默认原样带到目标地址。需要按参数分流时,用 Redirect Rules 的表达式或 Worker 判断。

重定向后旧页面的排名会立刻转移吗。

不会立刻。搜索引擎需要重新抓取并确认 301,周期从几天到几周不等。期间保持旧域名可解析、301 可用,别急着把旧域名删掉。

小结

站内跳转用 _redirects,一行一条,通配符能覆盖大多数批量场景。换域名用 Bulk Redirects,账号级配置,保留路径和查询串两个开关打开就够。

两个细节决定这套东西能不能长期用:状态码分清 301 与 302,测试阶段一律先 302;规则写完用 curl -I 跟一遍链路,确认没有循环。域名本身的接入见 49-add-domain-to-cloudflare.md,另一个域名怎么绑到同一站点见 69-pages-custom-domain-preview.md。

数据来源与检索时间

检索时间 2026-11-10。

来源URL对应数据
Pages Redirects 文档https://developers.cloudflare.com/pages/configuration/redirects/_redirects 语法、:splat 与占位符、200 代理语义、2,000 静态与 100 动态的额度
Bulk Redirects 文档https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/账号级列表、保留路径与查询串选项、CSV 导入
Pages Limitshttps://developers.cloudflare.com/pages/platform/limits/站点的重定向条数上限

核验说明

  • 文档部分:_redirects 的语法与额度、Bulk Redirects 的入口与选项,依据 2026-11-10 的官方文档页面整理。
  • 未执行:本机无 Pages 与 Zone 权限,没有上传过 _redirects 文件,也没有创建过 Bulk Redirects 列表或导入 CSV。控制台步骤为文档描述。
  • 未执行:curl -sI 的验证命令未对真实站点运行。
  • 未核实:免费档 Bulk Redirects 的具体条目配额,正文只说"以控制台显示的配额为准",没有给数字。
  • 未核实:/:path+/ 这条尾斜杠规则的实际匹配行为未在 Pages 环境验证,依据 Express 风格占位符写法推断,使用前建议用 302 先测。
  • 本地构建验证:无。