hreflang仅向搜索引擎声明多语言页面关系,不触发自动跳转或渲染变化;必须严格遵循bcp 47规范(如zh-hans、en-us),双向互指、绝对url、静态输出,且与lang属性职责分离。

hreflang 不会让页面自动切换语言,它只告诉搜索引擎“这个页面还有哪些语言版本”,别指望它触发跳转或改变渲染。
hreflang 值必须严格符合 BCP 47 规范
填错一个字符,Google 就会整条忽略。常见错误包括:zh_CN(下划线)、EN-us(语言大写)、chinese(非标准码)、zh-Hant-TW(多了一个连字符)。正确写法只有这些:
-
zh-Hans(简体中文,推荐优先用,比zh-CN更符合 BCP 47) -
zh-Hant-HK(香港繁体,三段式合法) -
en-US(美式英语,小写语言 + 大写地区) -
en(通用英语,但建议明确为en-GB或en-US)
注意:zh-CN 和 zh-Hans 是两个不同值,混用会导致关系断裂;x-default 不是“默认语言”,而是兜底页,通常指向英文首页。
每页必须双向互指且使用绝对 URL
你在 https://example.com/en/ 页面写了:<link rel="alternate" hreflang="zh-Hans" href="https://example.com/zh/">
那 https://example.com/zh/ 页面也必须反向声明:<link rel="alternate" hreflang="en" href="https://example.com/en/">
漏掉任意一条,Google 就认为“中文版没有对应英文版”,整个语言组可能被降权。关键约束:
- href 必须是绝对 URL,
/zh/或./zh/会被爬虫直接忽略 - 所有语言页都要完整包含整组
link[rel="alternate"][hreflang],不能靠模板省略“自己” - 同一页面中不能重复声明相同
hreflang值(比如静态写了一条,JS 又追加一条zh-Hans)
JS 动态注入 hreflang 极易翻车
爬虫不执行 JS,所以动态生成的 hreflang 标签对 SEO 零作用。更危险的是:后端已静态输出全部标签,前端 JS 却又遍历语言列表创建新 link 元素并 appendChild 到 head,结果每种语言被声明两次,Google 看到冲突就放弃解析。
Google索引API工具。用于提交URL以供Google索引。支持两种模式:“auto-index”(获取sitemap,与缓存对比差异并提交...)
如果必须 JS 注入(如 SPA 路由),务必先清理旧标签:
- 用
document.querySelectorAll('link[rel="alternate"][hreflang]')找出所有旧标签 - 显式调用
.remove(),别依赖innerHTML +=拼接 - 用
replaceChildren()替换整个head中的 alternate 链接更可控
hreflang 和 lang 属性完全无关
很多人以为加了 hreflang="zh-Hans",浏览器就会按中文排版、朗读、拼写检查——不会。这是 lang 属性的事。页面是否显示中文,取决于:
hreflang 是给搜索引擎看的关系声明,lang 是给浏览器和辅助技术(如屏幕阅读器)看的内容语言。两者职责分离,强行绑定只会让字体渲染异常、语音朗读错乱、SEO 关系失效。
真正实现“根据浏览器 Accept-Language 自动跳转”,得靠服务端重定向(Nginx / Node.js / PHP)或前端 JS 判断 navigator.language 后手动跳转——hreflang 在这件事里,连配角都算不上。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










