重定向与批量重定向:几千条旧链接怎么搬
读完这篇你能做到:用 _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 URL | old.example.com |
| Target URL | https://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 Limits | https://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 先测。 - 本地构建验证:无。