日期: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,避免缓存混淆。
- 保持稳定 URL:中文默认
- 实现方式:
- 构建阶段把首页 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/...暴露给客户端。
- 构建阶段把首页 HTML 输出到
- 验证:
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