# 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)之间做出选择，然后再回来添加标注。

## Video

The video is narrated in English, with English captions.

[What is hreflang, and how do I set it up?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-what-is-hreflang.mp4) (48秒)

Hreflang tells Google which URLs are language or regional versions of the same page, so it can show the right one in search results. Add it with HTML link tags, HTTP Link headers, or a sitemap, make every link reciprocal, and use valid codes such as en-GB, not en-UK. General Translation's `gt-next` gives every language its own URL, the prerequisite for hreflang.

## 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.
