使用方法
- 文本框里服务端直出的示例是三行「语言码|路径」,例如
zh-Hans-CN|/zh-cn/tool/;结果区同时给出以https://www.liuquan.net为域名生成的五行声明文本,脚本还没执行时页面也不空白。 - 域名框默认是
https://www.liuquan.net,必须带 http 或 https 协议头;改域名会立即重算所有行。 - 「当前页语言」下拉标记你自己所在的语言版本,默认日语。如果它没有出现在清单列出的语言里,工具会为它补一条自我引用行。
- 「包含 x-default」默认勾选,会多生成一条指向兜底页的声明;取消勾选则只输出清单里的语言版本。
- 回车留给换行,触发用 Ctrl 或 Command 加回车,也可以点「生成」;结果区每条声明后面标注整行字符数。
- 下方语言地区码表默认显示一部分,点「加载更多」展开其余行;「复制码表」复制制表符分隔文本,「导出 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/ | 30 | 84 | 语言段加一层目录,最常见的形态 |
| 常规路径 | /zh-cn/tools/convert/ | 44 | 98 | 语言段加两层目录,仍在常规范围 |
| 带查询 | /zh-cn/tools/?page=2 | 52 | 106 | 追加查询串,行长度明显上升 |
| 多语言深层 | /zh-hant-hk/tools/image/compress-image-to-100kb/?utm_source=nav&utm_medium=internal | 106 | 160 | href 超过 75 字符,建议缩短路径 |
第三张表是 8 条常见错误与后果,逐条对照可以避开大多数无效声明。
| 序号 | 错误 | 后果 |
|---|---|---|
| 1 | A 页指向 B,B 未回指 A | 忽略整组声明,两边都按普通页面处理 |
| 2 | 缺少自我引用 | 整组可能被判无效 |
| 3 | 语言码写成 zh_CN(下划线) | 非法,必须用连字符 zh-CN |
| 4 | 地区码小写 zh-cn | 地区子标签按惯例大写,小写虽能被容错但不规范 |
| 5 | 同一 URL 声明了两个互斥的 hreflang | 互相冲突,搜索引擎择一或忽略 |
| 6 | 用 hreflang 代替 canonical | 作用不同:前者是同一内容的其它语言版本,后者是重复内容的代表页 |
| 7 | x-default 指向不存在的页面 | 兜底失效,未匹配语言的用户被送到空白页 |
| 8 | 只声明了部分语言版本 | 未声明的版本可能被当成重复内容 |
结果边界、舍入与适用说明
- 域名不带 http 或 https 头时给出明确提示,不会硬拼出一个无效 URL。
- 清单里缺少竖线的行会被指出是第几行;格式要求是「语言码|路径」,不能用空格代替竖线。
- 语言码写成下划线(如 zh_CN)会被拦下,必须用连字符 zh-CN;地区子标签按惯例用两位大写。
- 路径必须以斜杠开头,否则与域名拼接后会缺一层目录分隔。
- x-default 只保留一条:清单里已有又勾选包含时,工具不再追加并给出提示。
- 输出是纯文本。页面不会把结果写进文档 head,也不在任何地方生成真正的标签。
- 行长度只统计这一行文本本身的字符数,中文与全角字符按 Unicode 码位计一个字符,URL 里的百分号编码按实际字符数计入。
- 本页只负责拼装等价集合的互指文本,不检查目标页面是否真的存在,也不判断内容是否重复——后者要靠 canonical 与内容治理。
常见问题
为什么我只在 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、响应头或站点地图,且三处必须一致。页面自身不会、也不应该在输出位置生成可被解析的标记。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容。
相关工具
- Meta 标签分析:检查页面已有的元信息是否完整。
- 标题标签生成器:生成与预览页面标题。
- Open Graph 图片尺寸指南:核对社交分享图的尺寸。
- SEO 审计清单:逐项排查站点的常见问题。
- 搜索结果预览工具:看标题与描述在结果页里的样子。