# General Translation Knowledge Base: 什么是 hreflang？如何设置？
URL: https://generaltranslation.com/zh/kb/what-is-hreflang.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Hreflang 用于告诉 Google 哪些 URL 是同一页面的不同语言或区域版本，以便在搜索结果中展示正确的版本。你可以通过 HTML link 标签、HTTP Link 响应头或站点地图来添加它，确保所有链接相互指向，并使用有效的代码，例如 en-GB，而不是 en-UK。
Category: 多语言 SEO
Last updated: 2026-10-20
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-20

Hreflang 的作用是将一个 URL 映射到另一个 URL，因此只有在每种语言都拥有独立 URL 后才能生效。如果你还没有确定 URL 结构，请先在[子目录、子域名和国家/地区域名](/kb/multilingual-url-structure)之间做出选择，然后再回来添加标注。

## hreflang 能做什么，不能做什么

Hreflang 会将同一页面的多个 URL 归入一个集群，并为每个 URL 标注语言，也可以选择同时标注地区。当德语用户的搜索命中你的英文定价页面时，Google 可以改为展示同一集群中的德语 URL。Google 的[本地化版本指南](https://developers.google.com/search/docs/specialty/international/localized-versions)指出，即使没有标注，Google 也可能自行发现替代项版本，但仍建议显式声明。

人们很容易对它抱有过高的期望：

* **它不是重定向。** Hreflang 帮助 Google 决定在搜索结果中展示哪个 URL，但并不保证特定的结果。访问者点击后会进入该 URL，之后如何处理则由你的服务器决定 (详见[网站应如何选择所提供的语言](/kb/locale-routing-seo)) 。
* **它不检测语言。** Google 表示，它既不使用 hreflang，也不使用 HTML `lang` 属性来检测页面语言，而是通过自身算法根据内容判断语言。
* **它无法弥补未翻译的页面。** 只有当主要内容仍未翻译时，Google 才会将本地化版本视为重复页面。如果只翻译了导航栏和页脚，hreflang 虽然能为页面加上标注，却无法让它真正区别于原页面。

## 如何添加 hreflang？

Google 将 HTML、HTTP 响应头和站点地图三种方式视为等效，并表示同时使用多种方式对搜索没有额外好处。请根据网站的构建方式，选择最合适的一种。

### HTML link 元素

在 `<head>` 中为每个版本 (包括当前页面) 各添加一个 `<link rel="alternate">`。所有版本中的这组标签都完全相同。URL 必须是完整的绝对地址 (应为 `https://example.com/de/preise`，而不是 `/de/preise`) 。

```html
<!-- /en/pricing、/de/preise 和 /fr/tarifs 的 <head> 中均放置以下相同内容 -->
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing" />
<link rel="alternate" hreflang="de" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing" />
```

不要在同一个 `<link>` 中将 hreflang 与 `media` 等其他属性混用，并务必检查渲染后的 HTML：如果链接最终位于格式规范的 `<head>` 之外，则不会生效。

### HTTP Link 响应头

对于没有 `<head>` 的文件 (例如 PDF) ，请在 `Link` 响应头中返回同一集群。每个 URL 都需用尖括号括起来，各条目之间以逗号分隔。

```http
Link: <https://example.com/en/guide.pdf>; rel="alternate"; hreflang="en",
      <https://example.com/de/leitfaden.pdf>; rel="alternate"; hreflang="de",
      <https://example.com/fr/guide.pdf>; rel="alternate"; hreflang="fr"
```

### XML 站点地图

使用站点地图，就无需在页面中添加这些标注。声明 `xhtml` 命名空间，为每个 URL 单独创建一个 `<url>` 条目，并在每个条目下列出所有版本 (包括其自身) 。据 Google 说明，这些子条目不计入站点地图的 URL 数量上限。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/en/pricing</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
  <url>
    <loc>https://example.com/de/preise</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
  <url>
    <loc>https://example.com/fr/tarifs</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
</urlset>
```

如果站点地图中的页面条目分布在多个区域设置文件夹中，请将站点地图放在站点根目录下。Google 的[站点地图指南](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)介绍了目录范围以及跨站点提交选项；hreflang 替代项 URL 可以指向其他域名。

## 所有方法通用的规则

* **尽可能在每个页面上使用同一套完整的链接集合，并包含页面自身。** 有三个语言版本，每个页面上就要有三个条目。如果难以维护完整的集合，Google 也能处理较小的互链组；此时应优先确保新版本与原始版本或主要版本之间互相回链。
* **链接必须双向互指。** 如果页面 X 列出了页面 Y，但 Y 没有反向列出 X，Google 会忽略这一对链接。这样可以防止其他网站冒充你的德语版本。
* **可选择添加 `x-default`。** 它用于为未匹配的语言指定后备页面，例如语言选择器或默认语言版本。即使不添加，hreflang 也能正常生效。后备页面应与当前页面相关，不要把所有深层页面都指向首页。
* **代码由语言和可选的地区组成。** 语言使用 ISO 639-1 (`de`) ，地区使用 ISO 3166-1 alpha-2 (`de-CH`) ，且不区分大小写。只写地区是无效的；如果把国家代码填在语言位置，含义就完全不同了：`be` 表示白俄罗斯语，而不是比利时。
* **可以使用文字体系。** Google 接受 ISO 15924 文字体系子标签，例如 `zh-Hans` 和 `zh-Hant`，也可以附加地区 (`zh-Hans-US`) 。对于 `zh-TW`，Google 会根据地区推断出繁体中文。
* **为地区变体提供仅含语言的后备页面。** 如果你有 `en-IE`、`en-CA` 和 `en-AU` 页面，请再添加一个 `en` 页面 (可以是这三者之一) ，供其他地区的英语用户访问。

有些有效的区域设置代码在这里并不适用。`es-419` (拉丁美洲西班牙语) 是合法的 BCP 47 标签，但 Google 的 hreflang 仅支持 ISO 3166-1 地区，因此请将该页面标注为 `es`，或改用具体国家，例如 `es-MX` 和 `es-AR`。

## hreflang 页面是否应使用自引用的规范网址？

对于各自独立的翻译页面，首选的规范网址通常应指向页面自身。Google 的[重复网址指南](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)建议，使用 hreflang 时，应将规范网址设为同一语言的页面；如果没有同语言的规范网址，则选择最合适的替代页面。不要将所有翻译页面的规范网址都指向英文页面。

同一语言的不同区域页面则需要另行考虑。如果 `en-US` 和 `en-GB` 的内容重复，你可以选定一个首选的英文规范网址，再通过 hreflang 标明各自面向的区域。请确保规范网址与 hreflang 信号保持一致，并在 Search Console 中查看 Google 实际选定的规范网址。声明的规范网址只是一个强信号，并不保证一定会被采用。

```html
<!-- 位于 https://example.com/de/preise 页面的 <head> 中 -->
<link rel="canonical" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing" />
<link rel="alternate" hreflang="de" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs" />
```

同一页面中还提到了两个相关细节：Google 会忽略带有 `hreflang` 属性的 `rel="canonical"` 链接，因此请将这两类链接分开设置；此外，在选择规范网址时，Google 会优先考虑属于某个 hreflang 集群的网址。集群中的每个版本都应使用其规范网址，切勿使用带有跟踪参数的变体网址。

## 常见的 hreflang 错误有哪些？

* **缺少回链。** 这是 Google 常见错误列表中的头号问题。通常是因为某个区域设置的模板漏掉了这段代码，或者新增语言只加到了部分页面上。
* **无效代码。** Google 会忽略 `UK` 和 `EU` 等保留地区代码，因此 `en-UK` 中的地区部分不会生效，应改用 `en-GB`。`es-419` 中的 `419` 等不受支持的地区同样无法识别。
* **相对 URL 或混用协议的 URL。** 替代项必须使用完整的绝对 URL；此外，Google 提醒，网站使用 HTTPS 时，不应在 hreflang 中列出 `http://` URL。
* **替代项未直接指向预期的可索引页面。** 请使用最终的规范网址，而不是重定向页面或错误页面。`noindex` 页面会被排除在搜索结果之外，因此无法成为你希望 Google 展示的结果。除了状态码，还应检查目标页面的内容及其回链。
* **仅翻译了模板的页面。** hreflang 无法让这类页面真正区分开来，而且 Google 指出，重复内容会带来糟糕的搜索体验。

## 如何检查 hreflang 是否生效？

Search Console 的“国际定位”报告已经下线：Google 已将其连同国家/地区定位设置一并[弃用](https://support.google.com/webmasters/answer/12474899)，但表示仍会继续支持和使用 hreflang。你可以改用以下方法进行检查：

* **抽查单个页面。** 获取页面 HTML，确认其中列出了页面自身及所有同级页面：

  ```bash
  curl -s https://example.com/de/preise | grep -o '<link[^>]*hreflang[^>]*>'
  ```

* **测试线上页面。** Google 的指南推荐了两款第三方工具 (并非由 Google 维护) ：用于检测单个 URL 的 [Merkle&#39;s hreflang tag tester](https://technicalseo.com/seo-tools/hreflang/)，以及用于生成标签的 [Aleyda Solis&#39;s hreflang generator](https://www.aleydasolis.com/english/international-seo-tools/hreflang-tags-generator/)。

* **爬取整个站点。** 爬虫可以检查所有页面之间是否相互引用。[Screaming Frog&#39;s hreflang audit](https://www.screamingfrog.co.uk/seo-spider/tutorials/how-to-audit-hreflang/) 会报告缺失的回链、返回非 200 状态码或标记了 `noindex` 的替代项、无效的语言代码，以及非规范网址的替代项。

* **验证站点地图。** 运行 `xmllint --noout sitemap.xml`，抢在 Google 之前发现格式错误的 XML。

## 使用 General Translation 设置 hreflang

General Translation 的 `gt-next` 通过 [`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware) 为每种语言提供独立的 URL，这是使用 hreflang 的前提。如果通过其 `pathConfig` 选项配置了本地化 slug (例如 `/fr/a-propos`) ，那么每个本地化路径就是你在 hreflang 集群中列出的 `href`。

hreflang 标注本身仍需在你的应用中添加。Next.js 会根据 `metadata.alternates.languages` 生成 `<link rel="alternate" hreflang>` 标签，而[如何为多语言 Next.js 应用设置 SEO？](/kb/multilingual-nextjs-seo)中提供了一个辅助函数，一次调用即可返回规范网址及所有替代项。你可以把已配置的区域设置作为候选，再只列出每个页面实际已发布的版本。

如果你为某个区域设置使用了别名路由，例如用 `/cn` 表示中文，[区域设置别名 SEO 指南](/docs/react/nextjs/locale-alias-seo)会借助 [`resolveCanonicalLocale`](/docs/react/nextjs/reference/functions/resolve-canonical-locale)，让 hreflang 使用 BCP 47 代码 `zh`，同时 URL 仍保留 `/cn`。

## 要点总结

* Hreflang 用于在搜索结果中将 URL 对应到相应的语言和地区。它不会重定向访问者，也不会告诉 Google 页面使用的是哪种语言。
* 选用一种方法即可 (HTML `<link>`、用于 PDF 的 HTTP `Link` 响应头，或站点地图中的 `xhtml:link`) ；Google 对这几种方法一视同仁。
* 尽量提供一整套等效 URL，并包含自引用和双向链接。规模较小的双向链接组同样可以被处理；`x-default` 为可选项。
* 代码由 ISO 639-1 语言代码加上可选的 ISO 3166-1 alpha-2 地区代码或 ISO 15924 文字体系代码组成：应使用 `en-GB` 而非 `en-UK`，使用 `es-MX` 而非 `es-419`。
* 保持规范网址一致，不同语言的译文页面通常使用指向自身的规范网址。同一语言下内容重复的区域页面需单独处理，并使用爬虫检查回链。

## Related questions

- [如何为多语言 Next.js 应用设置 SEO？](https://generaltranslation.com/zh/kb/multilingual-nextjs-seo.mdx): 为每种语言提供带前缀的独立 URL，例如 /en/about 和 /es/about，然后为每种已发布的语言提供 html lang、自引用的规范网址、包含 x-default 的 hreflang 替代项、翻译后的 title 和 description，以及站点地图条目。将未发布的版本标记为 noindex。General Translation 的 gt-next 会将每种语言路由到各自的 URL，并通过 getGT 翻译标题。
- [多语言 SEO：子目录、子域名与 ccTLD 对比](https://generaltranslation.com/zh/kb/multilingual-url-structure.mdx): 如果同一产品共用一个站点和发布流程，请使用 example.com/de/ 这样的子目录。只有 ccTLD 能指明目标国家，子域名便于独立托管；Google 不建议使用 ?lang= 参数，并会将 .io、.ai 等个性化域名视为通用域名。
- [语言重定向与 SEO：URL、cookie 还是 Accept-Language？](https://generaltranslation.com/zh/kb/locale-routing-seo.mdx): 凡是希望被搜索引擎收录的页面，都应由 URL 决定其语言，因为 Googlebot 不会发送 Accept-Language 请求头，而且大多从美国 IP 地址抓取。只有在决定 / 这类中性根路径重定向到哪里时，才应优先参考 cookie 中保存的用户选择，其次是 Accept-Language，并使用临时的 302 或 307 重定向。
- [语言切换器最佳实践：用户体验、SEO 与无障碍访问](https://generaltranslation.com/zh/kb/language-switcher.mdx): 用每种语言的本语名称来标注它，例如 Deutsch 或 日本語，不要使用国旗，因为国旗代表的是国家。每个选项都应通过可抓取的链接指向该语言版本的同一页面，用 cookie 记住用户的选择，并且切勿对已本地化的 URL 自动重定向。
- [多语言应用本地化测试清单](https://generaltranslation.com/zh/kb/multilingual-app-launch-checklist.mdx): 在生产环境构建中，于每个支持的区域设置下测试九项内容：包括错误状态和邮件在内的完整流程、语言切换、复数形式、货币与时区、文本扩展、从右到左布局、无障碍访问、译文交付，以及可抓取的语言 URL。为每项检查设定明确的通过标准。

## Previous and next questions

- Previous question: [AI 翻译的准确度足以用于生产环境应用吗？](https://generaltranslation.com/zh/kb/is-ai-translation-accurate.mdx)
- Next question: [什么是 ICU 消息格式？](https://generaltranslation.com/zh/kb/icu-message-format.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/zh/kb/sitemap.md) for every article.
