Cloudflare Workers Static Assets 迁移教程:_redirects、_headers 和 SPA 404 怎么验收

把静态站迁到 Workers Static Assets,不能只看页面能否打开。跳转、header、SPA 404、缓存命中和 workers.dev 索引边界都要验收。

把静态站迁到 Workers Static Assets,不能只看页面能否打开。跳转、header、SPA 404、缓存命中和 workers.dev 索引边界都要验收。

  1. 01先读摘要,判断是否与你的场景相关。
  2. 02再看来源,保留继续查证的路径。
  3. 03最后看步骤、风险和可复用动作。

把静态站迁到 Workers Static Assets,不能只看首页能否打开。真正影响搜索、分享和转化的,是旧链接是否跳对、安全 header 是否生效、SPA 路由是否误返 404、缓存策略是否可控。

更新日期与来源依据

更新日期:2026-06-27。Cloudflare Workers Static Assets 文档说明,`_redirects` 和 `_headers` 文件应放在静态资产目录,Workers 会在静态资产响应上解析这些规则;redirects 会先于 headers 生效。公开来源限制为三条:Workers redirects、Workers headers、Static Assets overview。

这篇教程面向迁移和验收,不教绕过 Cloudflare 限制,也不替代生产变更审批。迁移前请先确认域名、构建产物、DNS 和回滚路径。

适用场景

  • 你要把一个文档站、作品集、落地页或前端单页应用从 Cloudflare Pages、Netlify、Vercel 静态输出或普通对象存储迁到 Workers。
  • 旧站已经有 `_redirects`、`_headers`、`robots.txt`、`sitemap.xml`、自定义 404 或 SPA fallback。
  • 你希望迁移后保留旧 URL 权重,避免 workers.dev 预览域被索引,并给静态资源配置更明确的缓存和安全 header。
  • 你没有复杂后端,只需要 Worker 在少数路径前置处理,其余静态文件由资产系统服务。

不适用场景

  • 站点依赖服务端渲染、登录态、数据库写入或复杂 API,迁移重点应放在应用架构和绑定资源,不是 `_redirects` 文件。
  • 站点有超过 2,100 条跳转规则,Cloudflare 文档建议改用 Bulk Redirects 等更适合大量规则的方案。
  • 你需要按用户、地区、Cookie 或 A/B 实验动态决定 header,`_headers` 文件不适合这种逻辑,应放到 Worker 代码里。

准备材料

  • 旧站 URL 清单:至少包含首页、栏目页、旧文章、带尾斜杠和不带尾斜杠的 URL、被外链引用的历史路径。
  • 构建产物目录:例如 `dist/`、`public/` 或 `static/`,确认 `_redirects` 与 `_headers` 会被复制进去。
  • 一份 404 与 SPA 路由决策:到底是未命中文件返回最近的 404 页面,还是返回 `index.html`。
  • 上线前验证命令:`curl -I`、浏览器移动端检查、Search Console URL 检查、站点地图访问。
  • 回滚方式:保留旧托管配置、DNS TTL、上一个部署版本和跳转规则备份。

操作步骤

  1. 第一步,盘点旧链接。把旧 sitemap、访问日志、Search Console 高点击页面和手动维护的旧链接放进一张表,标记“保留、301、410、合并到新页”。
  2. 第二步,写 `_redirects`。静态跳转放前面,动态匹配放后面。每条规则控制在文档限制内,避免把外部域名误写成站内路径。
  3. 第三步,写 `_headers`。给 `workers.dev` 预览域设置 `X-Robots-Tag: noindex`,给静态资源目录设置长期缓存,给应用页设置基础安全 header。
  4. 第四步,决定 not_found 行为。内容站和文档站优先用 404 页面;SPA 才考虑把未命中路径交给 `index.html`,并用真实不存在路径验收。
  5. 第五步,部署到预览域。不要先切主域名,先用预览 URL 测跳转、header、图片、字体、sitemap 和 robots。
  6. 第六步,切主域并做抽检。抽检至少覆盖旧 URL、动态匹配 URL、静态资源、404、移动端页面和站点地图。

可复制配置示例

以下示例适合小型内容站迁移,部署前请把域名和路径改成自己的。

# _redirects
/old-post-a /new-post-a 301
/docs/:slug /guides/:slug 301
/legacy/* /archive/:splat 301

# _headers
https://:version.:subdomain.workers.dev/*
  X-Robots-Tag: noindex

/static/*
  Cache-Control: public, max-age=31556952, immutable

/*
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin

验收清单

  • 旧站 Top 20 URL 返回 200 或预期的 301,且最终目标不是首页兜底。
  • `curl -I https://preview-domain/path` 能看到预期 header;跳转路径不会继续应用 header 规则造成误判。
  • 随机不存在路径返回预期 404 或 SPA fallback,Search Console 不会把大量错误路径当可索引内容。
  • 静态资源有明确缓存策略,HTML 页面没有被设置成过长缓存。
  • workers.dev 预览域不会被索引,主域 sitemap、robots、favicon、Open Graph 图片仍可访问。

常见坑与排错路径

  • 坑一:`_redirects` 放在源码根目录,但构建时没有进入静态资产目录。排错时查看最终 `dist/` 是否真的包含该文件。
  • 坑二:SPA fallback 把所有旧文章都返回首页,搜索引擎看到大量软 404。解决方式是对历史内容写明确 301 或真实 404。
  • 坑三:给 `/*` 设置过长缓存,导致 HTML 更新后用户一直看到旧页面。静态资源可长缓存,HTML 建议保守。
  • 坑四:只测主域,不测预览域。预览域如果被索引,后续会出现重复页面和品牌搜索干扰。

排错顺序:先看构建产物是否包含规则文件,再用 `curl -I` 看响应头,再用 `curl -L -I` 看跳转链,最后在浏览器里检查移动端布局和图片加载。不要在 DNS 已切换后才开始写跳转规则。

判断规则与维护建议

  • 如果跳转规则少于 50 条,手写 `_redirects` 通常足够;如果接近文档限制或来自多个历史域名,改用批量跳转产品。
  • 如果页面需要登录、Cookie 或地域判断,不要用 `_headers` 期待动态控制,放进 Worker 代码。
  • 如果迁移后 7 天内 404 增长明显,先修旧 URL 映射,不要只提交 sitemap。
  • 每次改版后复查四个指标:旧 URL 命中、404 趋势、HTML 缓存、预览域索引状态。

来源

订阅更新

输入邮箱,订阅站点更新。

参与讨论

你的邮箱不会公开。 标有 * 的为必填项。