Hreflang 标签生成器

把一份「语言码|路径」清单拼成一整组互相指向的 hreflang 声明文本,自动补上当前页的自我引用与 x-default 兜底页,并逐条标出整行字符数。双向声明、连字符书写与长度预算都在这一页里核对,输出是纯文本。

默认勾选
域名 https://www.liuquan.net · 共 5 条声明 · zh-Hans-CN / zh-Hant-HK / en-US / ja-JP / x-default
<link rel="alternate" hreflang="zh-Hans-CN" href="https://www.liuquan.net/zh-cn/tool/" />
<link rel="alternate" hreflang="zh-Hant-HK" href="https://www.liuquan.net/zh-hk/tool/" />
<link rel="alternate" hreflang="en-US" href="https://www.liuquan.net/en-us/tool/" />
<link rel="alternate" hreflang="ja-JP" href="https://www.liuquan.net/ja-jp/tool/" />
<link rel="alternate" hreflang="x-default" href="https://www.liuquan.net/tool/" />

使用方法

  1. 文本框里服务端直出的示例是三行「语言码|路径」,例如 zh-Hans-CN|/zh-cn/tool/;结果区同时给出以 https://www.liuquan.net 为域名生成的五行声明文本,脚本还没执行时页面也不空白。
  2. 域名框默认是 https://www.liuquan.net,必须带 http 或 https 协议头;改域名会立即重算所有行。
  3. 「当前页语言」下拉标记你自己所在的语言版本,默认日语。如果它没有出现在清单列出的语言里,工具会为它补一条自我引用行。
  4. 「包含 x-default」默认勾选,会多生成一条指向兜底页的声明;取消勾选则只输出清单里的语言版本。
  5. 回车留给换行,触发用 Ctrl 或 Command 加回车,也可以点「生成」;结果区每条声明后面标注整行字符数。
  6. 下方语言地区码表默认显示一部分,点「加载更多」展开其余行;「复制码表」复制制表符分隔文本,「导出 CSV」下载带 UTF-8 BOM 的文件。

这个 Hreflang 标签生成器能解决什么问题

它回答的是多语言站点的互指问题:同一篇内容有简体中文、繁体中文、英语、日语等多个版本,每个版本都要在自己的页面里声明「我的其它语言版本在哪里」。本页把一份「语言码|路径」清单,拼成一整组互相指向的声明文本,并补上当前页自身的自我引用与兜底页,省掉逐行手写时容易漏项、容易把连字符写成下划线的麻烦。

它的产物是纯文本:结果区里只是若干行字符,本页不会、也不应该把真正的标签写进输出。要上线时把这些文本放进页面 head、HTTP 响应头或 XML 站点地图三者之一即可,三种口径的内容必须一致,不能一处写一套。

与其他 SEO 工具的分工不同:Meta 标签分析看的是页面已有的元信息,标题标签生成器管页面标题,Open Graph 图片尺寸指南管社交分享图;本页只管跨语言互指这一件事,和它们不是同一类问题。它与 canonical 也不是替代关系,下面原理一节说明两者的分界。

计算原理与变量说明

生成过程分三步:逐行解析「语言码|路径」并校验格式;把域名与路径拼成完整 URL,套进声明模板得到每一行;再检查当前页语言与 x-default 是否已经包含,缺哪条补哪条。下面四条机制决定这份输出是否真的有效。

一、双向声明,单向会被整体忽略。A 页声明它对应的 B 页,B 页也必须声明它对应的 A 页;只在一侧写、另一侧不写,搜索引擎会忽略整组声明,两边都按普通页面处理。这就是它与 canonical 最本质的差别:canonical 单向即可,说的是「这些重复内容里哪个是代表」;hreflang 说的是「这一组等价页面各自面向哪个地区」。所以本页一次产出的是「一整组互相指向」的文本,而不是一条孤立的声明。

二、每一组必须包含自我引用。当前页也要在组里声明自己,漏掉自我引用是整组失效的头号原因。本页用「当前页语言」下拉标记你所在的版本:如果清单里没有它,就自动补一条自我引用行。例如清单已有简体、繁体、英语,当前页选日语,结果就会多出一行指向日语版本,并用第一条路径推导出它的路径。

三、x-default 是兜底页,不是默认语言。它指向语言选择页,或在用户的语言一个都没匹配上时该落到哪个页面;它与「第一个语言版本」是两回事。一个站点可以没有日语版,但通常仍应有 x-default。本页默认勾选它,并且只保留一条——清单里已有又重复添加时会被拦下并提示。

四、hreflang 与 canonical 分工不同。hreflang 决定把哪个语言版本给哪个地区的用户看,canonical 决定这一组重复内容里索引哪个 URL。两者同时存在时各管一段:地区定向归 hreflang,去重归 canonical。拿 hreflang 去代替 canonical 是常见误用,它并不能解决内容重复。

变量说明。页面有四个可调项:清单文本、域名、当前页语言、是否含 x-default。语言码书写顺序是 language 加可选的 script 再加可选的 region:语言码用 ISO 639-1 两位小写(zh、en、ja),script 用 Hans、Hant,地区码用 ISO 3166-1 Alpha-2 两位大写(CN、HK、US)。只用语言也合法(例如 zh)。下拉里的 x-default 其语言前缀为空,对应路径不带语言段。

完整示例(数值仅作演示)

示例条件:域名为 https://www.liuquan.net,清单为下面三行,当前页语言选日语,并勾选包含 x-default。

zh-Hans-CN|/zh-cn/tool/
zh-Hant-HK|/zh-hk/tool/
en-US|/en-us/tool/

生成结果共五行,每条互相指向,且包含当前页(日语)的自我引用与 x-default 兜底页,逐行字符数为 89、89、84、84、82:

<link rel="alternate" hreflang="zh-Hans-CN" href="https://www.liuquan.net/zh-cn/tool/" />
<link rel="alternate" hreflang="zh-Hant-HK" href="https://www.liuquan.net/zh-hk/tool/" />
<link rel="alternate" hreflang="en-US" href="https://www.liuquan.net/en-us/tool/" />
<link rel="alternate" hreflang="ja-JP" href="https://www.liuquan.net/ja-jp/tool/" />
<link rel="alternate" hreflang="x-default" href="https://www.liuquan.net/tool/" />

其中日语的路径 /ja-jp/tool/ 与 x-default 的路径 /tool/ 都不是清单里写死的,而是由工具推导:把第一条路径里属于它语言前缀的那一段换成新的语言前缀,就得到自我引用行的路径;把语言前缀整段去掉,就得到 x-default 的路径。上面每条都能用页面自己的算法复算,页面里没有任何「看到某个输入就返回写死答案」的分支。

语言地区码与长度对照表

第一张表是 14 条常用语言地区码及其书写形式。中间几行默认折叠,可点「加载更多」展开;「复制码表」复制制表符分隔文本,「导出 CSV」带 UTF-8 BOM。

语言码含义书写形式
zh-Hans-CN简体中文(中国大陆)language-script-region
zh-Hant-HK繁体中文(中国香港)language-script-region
zh-Hant-MO繁体中文(中国澳门)language-script-region
en-US英语(美国)language-region
en-GB英语(英国)language-region
ja-JP日语(日本)language-region
ko-KR韩语(韩国)language-region
de-DE德语(德国)language-region
fr-FR法语(法国)language-region
es-ES西班牙语(西班牙)language-region
pt-BR葡萄牙语(巴西)language-region
ru-RU俄语(俄罗斯)language-region
ar-SA阿拉伯语(沙特)language-region
x-default未匹配时的兜底页special

第二张表是整行长度预算,用来判断路径是不是太长。整行字符数等于固定前缀、语言码、固定中段、域名与路径、固定后缀这几段之和,路径越长越要留意。

场景示例路径href 字符数整行字符数说明
简短路径/zh-cn/3084语言段加一层目录,最常见的形态
常规路径/zh-cn/tools/convert/4498语言段加两层目录,仍在常规范围
带查询/zh-cn/tools/?page=252106追加查询串,行长度明显上升
多语言深层/zh-hant-hk/tools/image/compress-image-to-100kb/?utm_source=nav&utm_medium=internal106160href 超过 75 字符,建议缩短路径

第三张表是 8 条常见错误与后果,逐条对照可以避开大多数无效声明。

序号错误后果
1A 页指向 B,B 未回指 A忽略整组声明,两边都按普通页面处理
2缺少自我引用整组可能被判无效
3语言码写成 zh_CN(下划线)非法,必须用连字符 zh-CN
4地区码小写 zh-cn地区子标签按惯例大写,小写虽能被容错但不规范
5同一 URL 声明了两个互斥的 hreflang互相冲突,搜索引擎择一或忽略
6用 hreflang 代替 canonical作用不同:前者是同一内容的其它语言版本,后者是重复内容的代表页
7x-default 指向不存在的页面兜底失效,未匹配语言的用户被送到空白页
8只声明了部分语言版本未声明的版本可能被当成重复内容

结果边界、舍入与适用说明

常见问题

为什么我只在 A 页写了 hreflang,没有效果?

因为它是双向声明。A 页指向 B 页,B 页也必须回指 A 页;只在单侧写,搜索引擎会忽略整组声明,两页都按普通页面处理。本页一次生成一整组互相指向的文本,就是为了避免这种单向漏写。

当前页要不要也写进这一组?

要。每一组都必须包含自我引用,漏掉它是整组失效的头号原因。本页用「当前页语言」下拉标记你的版本,清单里没有它时会自动补一行;示例里当前页是日语,所以结果多出 ja-JP 那一行。

x-default 应该指向首页还是语言选择页?

指向语言选择页,或在语言都没匹配上时该落地的那一页。它不是「默认语言」,和第一个语言版本是两回事。示例里 x-default 指向不带语言段的 /tool/,而不是 /zh-cn/tool/。

hreflang 能替代 canonical 吗?

不能。两者分工不同:hreflang 决定哪个语言版本给哪个地区看,canonical 决定重复内容里索引哪个 URL。同时存在时各管一段,拿 hreflang 去代替 canonical 并不能解决内容重复。

语言码里能用下划线吗?

不能。地域子标签之间必须用连字符,写成 zh-CN;下划线写法 zh_CN 会被判为非法。地区码按惯例用两位大写,zh-cn 虽能被容错但不规范。本页遇到下划线会直接拦下并提示。

输出为什么是纯文本,而不是真的标签?

本页只负责把文本拼好供你复制,结果区里的每一行都是纯文本。真正的标签要由你放进页面 head、响应头或站点地图,且三处必须一致。页面自身不会、也不应该在输出位置生成可被解析的标记。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具