hreflang标签仅用于搜索引擎识别多语言页面关系,不触发浏览器跳转;必须严格遵循bcp 47规范(如zh-cn、en-us)、使用绝对url、双向互指,且与html的lang属性无关。

link[rel="alternate"] 的 hreflang 值必须严格匹配语言和地区代码
浏览器和搜索引擎只认标准的 hreflang 值,比如 zh-CN、en-US、ja-JP,不能写成 zh 或 cn 单独使用,否则多语言跳转失效。Google 搜索结果中语言/地区筛选依赖这个值是否规范。
常见错误是把用户语言偏好(如 navigator.language 返回的 zh-CN)直接当 hreflang 用,但站点实际没部署对应版本,导致跳转 404;或者用了非标准写法如 zh-ch、en_uk,被忽略。
-
hreflang必须是 IETF BCP 47 标准格式:语言子标签(小写) + 可选地区子标签(大写),中间用连字符连接 - 每个
link[rel="alternate"][hreflang]必须配对出现:A 页面要声明自己是zh-CN,同时在zh-CN页面里反向声明回 A 页面的hreflang - 如果只有语言差异、无地区区分(如全球英语站),用
en;若有地区差异(如美式/英式英语内容不同),必须用en-US、en-GB
hreflang 和 canonical 的组合容易引发 SEO 冲突
当页面有多个语言/地区版本时,canonical 指向自身是安全的;但如果误设为指向主站首页或某个语言版本,搜索引擎会认为其他 alternate 页面是重复内容,降权甚至不索引。
典型场景:用户从 Google 搜索进入 example.com/en-US/product,但该页的 canonical 指向 example.com/product(默认语言页),而后者又没声明 hreflang="en-US",整个链路就断了。
Perplexity SEO 优化指南 — 如何获得 Perplexity AI 的引用。涵盖 Perplexity 引用行为、面向 Perplexity 答案的内容结构、Perplex...
- 每个语言/地区页面的
canonical应始终指向自己,即<link rel="canonical" href="https://example.com/en-US/product"> -
hreflang是声明“这些页面内容相同但面向不同用户”,canonical是声明“这是该内容的首选版本”——二者目的不同,不可混用 - 避免在
hreflang链中遗漏任一语言版本,哪怕只是占位页,否则 Google 可能忽略整组声明
服务端无法动态生成 link 标签时,用 JavaScript 注入风险高
SEO 场景下,link[rel="alternate"] 必须在 HTML 初始响应中存在,搜索引擎爬虫基本不执行 JS,所以靠 JS 动态插入的 hreflang 不会被识别。
有些团队想用 document.write 或 head.appendChild 根据 localStorage 或 URL 参数加 link,这只能影响前端跳转逻辑(比如点击语言切换按钮),对搜索索引和自动跳转无效。
- 静态站点:用构建脚本(如 Eleventy、Hugo)按语言目录生成独立 HTML,并在每份中硬编码对应
hreflang链 - SSR/服务端渲染:在模板中根据当前请求路径或 host 决定输出哪些
link[rel="alternate"],确保首屏 HTML 包含全部 - 纯客户端 SPA:无法靠
hreflang实现搜索引擎导向,需配合 HTTPLink响应头(如Link: <https:></https:>; rel="alternate"; hreflang="ja")
浏览器不会自动跳转,hreflang 不是重定向机制
hreflang 只是给搜索引擎和浏览器扩展(如翻译插件)提供语义提示,浏览器本身不解析它做跳转。所谓“定向跳转”必须由开发者额外实现:检测用户语言偏好后,用 JS 或服务端逻辑做 302 跳转。
常见误解是加了 hreflang 就能让用户访问 example.com 时自动进 example.com/zh-CN,实际上除非你写了跳转逻辑,否则用户永远看到的是默认入口页。
- 判断依据优先级应为:URL path / subdomain →
Accept-Language请求头 →navigator.language(仅作 fallback) - 服务端跳转比前端 JS 更可靠:Nginx 可用
map模块匹配$http_accept_language,CDN 如 Cloudflare 支持规则引擎做地区+语言路由 - 若用 JS 跳转,注意避免循环:用户从
/en-US/被跳到/zh-CN/后,再刷新不应又被跳回/en-US/,需持久化用户选择(如 cookie 或 URL 参数)
hreflang 的双向声明完整性,以及把它和运行时跳转逻辑混为一谈。两者解决的问题完全不同:一个是索引归属,一个是用户体验路径。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










