lang属性写错会导致hreflang整组失效:html根标签lang值与hreflang语言代码不一致(如zh-cn与zh-cn)时,google会静默忽略整组hreflang;lang必须严格符合bcp 47规范,仅用短横线、大小写敏感;hreflang需成组互指且覆盖全部语言变体,含自身及x-default兜底页;所有href须为绝对url且协议一致;局部多语言内容须显式设lang;hreflang与lang职责分离,不可混用。

lang属性写错会导致hreflang整组失效
Google明确要求:如果页面的html根标签lang值和<link rel="alternate" hreflang="zh-CN">中的语言代码不一致(比如一个写zh-cn,另一个写zh-CN),它会判定整组hreflang自相矛盾,直接静默忽略——不是报错,而是当没写。
-
lang必须严格符合BCP 47规范:只用短横线-,不用下划线_;大小写敏感,zh-cn≠zh-CN - 常见非法值:
zh_CN、Chinese、zh-ch、cn——浏览器和搜索引擎全当没设 - 验证方式:用Google Search Console的「URL检查」工具抓取页面,看「国际化」标签页是否列出有效对应关系
hreflang必须成组互指且覆盖全部语言变体
每个语言版本页面的里,都要完整声明所有已知语言-地区版本(含自身),漏掉任意一个,整组可能被降权。这不是可选优化,是硬性要求。
- 例如有
en-US、zh-Hans、ja-JP三个版本,每页都得写三条<link rel="alternate" hreflang="...">,包括指向自己的那条 -
hreflang="x-default"不是替代项,而是兜底页(如语言选择器页或英文首页),不能省略具体语言标签 - 所有
href必须是绝对URL:https://example.com/zh/✅,/zh/❌,./zh/❌ - 协议必须一致:HTTP和HTTPS混用,会被当成两个不同页面,
hreflang关系断裂
局部多语言内容必须显式设lang,不能靠JS批量改根节点
lang属性作用于元素及其子节点,不是全局开关。只改document.documentElement.lang,对已渲染的子元素无效——屏幕阅读器仍按旧语言朗读,翻译插件也识别错。
- 中文页面里嵌一段英文术语?加
<span lang="en">API</span> - 代码块里有
curl -X POST?给<pre class="brush:php;toolbar:false;"></pre>加lang="bash"(非BCP 47但被工具识别)或lang="en" - SPA中切换语言时,必须同步更新
document.documentElement.lang和所有含语义的子元素lang属性 - 别用
[lang="en"]选择器做样式控制——它只匹配显式写了lang="en"的元素;要用:lang(en)伪类,它能继承父级语言
hreflang和lang完全无关,别指望它自动跳转或影响渲染
hreflang只告诉搜索引擎“这个页面还有哪些语言版本”,lang才决定浏览器怎么渲染、屏幕阅读器怎么读、拼写检查用哪套词典。两者职责分离,强行绑定必翻车。
- 英文页写了
hreflang="zh-CN"指向中文版,但中文版?浏览器仍当中文页渲染,字体错、标点挤、语音乱 -
hreflang不会触发自动跳转——法国用户访问/,还是看到默认页,除非你额外部署服务端语言探测或前端JS重定向 - 动态JS注入
hreflang基本无效:爬虫不执行JS;更危险的是后端已静态输出,前端又重复追加,导致同一hreflang值出现两次,Google直接放弃解析
lang和hreflang在各自生态里的独立性:一个管“内容是什么语言”,一个管“链接指向什么语言”。写错一个字符、漏掉一个互指、混用大小写,问题不会立刻报错,而是悄悄让SEO失效。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











