Online Free Tools
  • Home
  • Dev Logs
Navigation
HomeDev Logs

为 SEO 采用服务端 Accept-Language 协商:根路径 `/` 临时重定向到 `/en/`,并避免静态 assets 抢占导致协商失效。 | Dev Logs

Back to Logs

日期:2026年1月11日0时16分 摘要:为 SEO 采用服务端 Accept-Language 协商:根路径 / 临时重定向到 /en/,并避免静态 assets 抢占导致协商失效。 【question】 采用 curl -D - -H 'Accept: text/html' -H 'Accept-Language: en' http://127.0.0.1:8787/ 发现页面显示的是中文,而不是英文,按照符合seo的模式处理用户语言问题 【try to solve】

  • 根因:本地/线上静态 assets 在命中 public/index.html 时可能直接返回资源,导致 Worker 的语言协商逻辑无法对 / 生效。
  • 方案(SEO 友好):
    • 保持稳定 URL:中文默认 /,英文固定 /en/。
    • 对用户语言偏好只做“临时重定向”(302),不做永久跳转,避免搜索引擎把语言协商当成永久规则。
    • 对重定向响应增加 Vary: Accept-Language, Accept,避免缓存混淆。
  • 实现方式:
    • 构建阶段把首页 HTML 输出到 public/_pages/{lang}/index.html,避免 / 与 /en/ 被静态 assets 直接命中。
    • Worker 显式处理 / 与 /en/:
      • GET / + Accept: text/html:若 Accept-Language 偏好英文则 302 到 /en/,否则返回中文首页。
      • GET /en/:返回英文首页。
      • 内部拉取 env.ASSETS 时若发生 index.html → / 的规范化跳转,Worker 在服务端跟随后返回最终 200,避免把内部 /_pages/... 暴露给客户端。
  • 验证:
    • curl -D - -H 'Accept: text/html' -H 'Accept-Language: en' http://127.0.0.1:8787/ 返回 302 Location: /en/。
    • curl -L ... 最终停留在 /en/。 【执行操作】
  • 修改:src/index.ts、scripts/build-site.mjs
  • 生成:public/_pages/zh/index.html、public/_pages/en/index.html
  • 删除:public/index.html、public/en/index.html
Online Free Tools · Learning project · Iterating