HTML不支持国际化自动跳转,linkrel="alternate"仅作用于搜索引擎;最常用方案是JavaScript读取navigator.language做前端跳转,或服务端依据Accept-Language头302重定向。

HTML 本身不提供国际化自动跳转能力;link[rel="alternate"][hreflang] 标签只对搜索引擎生效,浏览器完全忽略它——加了也不会跳,更不会改语言内容。
用 JavaScript 读取 navigator.language 做跳转
这是最常见、可控性最强的前端方案,适用于静态站点或 SSR 页面未做服务端语言路由时。
-
navigator.language或navigator.languages[0]给出浏览器首选语言(如zh-CN、en-US、ja-JP) - 需手动映射到你的语言路径:比如
zh→/zh/,en→/en/,其余兜底到默认语言 - 建议在
<head>里尽早执行,避免白屏或闪动;但别放在<script>标签外直接写逻辑,要包裹在DOMContentLoaded或立即执行函数中 - 注意:iOS Safari 的
navigator.language可能返回zh-Hans,而 Chrome 桌面可能返回zh-CN,匹配时建议用.startsWith('zh')而非全等
示例片段:
<script>
const lang = navigator.language || navigator.userLanguage;
if (lang.startsWith('zh')) {
window.location.href = '/zh/';
} else if (lang.startsWith('ja')) {
window.location.href = '/ja/';
} else {
window.location.href = '/en/';
}
</script>
服务端根据 Accept-Language 头做 302 重定向
比前端 JS 更可靠,避免用户看到空白页或错误语言内容,适合 Nginx / Node.js / PHP 等环境。
立即学习“前端免费学习笔记(深入)”;
- HTTP 请求头
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8是权威信号,比 JS 获取的更可信 - Nginx 示例:用
map指令提取首语言并 rewrite,或配合return 302 - Node.js(Express)示例:解析
req.headers['accept-language'],调用res.redirect(302, '/zh/') - 必须确保重定向目标页面真实存在,否则会陷入 404 循环
- 若使用 CDN,确认它透传了
Accept-Language头(有些默认不传)
别把 hreflang 当跳转机制用
这是最容易踩的坑:你在 /zh/ 页面里写了 <link rel="alternate" hreflang="en" href="https://example.com/en/">,用户打开 /zh/ 后依然看到中文页——这完全正常,也应该是这样。
-
hreflang的唯一作用是告诉 Google:“这个中文页和那个英文页语义等价”,仅用于搜索结果展示 - 它不要求页面内容一致,也不触发任何前端行为;即使漏写反向链接,JS 跳转照样运行
- 如果你发现“用户没跳过去”,第一反应不该是检查
hreflang,而是确认 JS 是否执行、服务端是否收到 header、目标路径是否 404 - 混用
hreflang="zh-CN"和hreflang="zh-Hans"不会导致跳转失败,但会让搜索引擎困惑,建议统一用 BCP 47 推荐格式(如zh-Hans)
真正难的不是写跳转代码,而是保证跳转后页面的语言内容、lang 属性、字体渲染、标点间距、屏幕阅读器语音全部同步到位——这些都得靠独立的语言加载逻辑,跟跳转本身是两件事。



















