GitHub Pages 多域名绑定指南:突破 CNAME 单域名限制

前言

GitHub Pages 是一个优秀的静态网站托管服务,但有一个限制:CNAME 文件只能包含一个域名。如果你有多个域名(如 clarklu.comluzihang.com)想要指向同一个 GitHub Pages 网站,本文提供了完整的解决方案。

GitHub Pages 的 CNAME 限制

为什么只能有一个域名?

GitHub Pages 使用 CNAME 文件来指定自定义域名。这个文件位于仓库的根目录或 source/ 目录(如果使用 Hexo 等静态网站生成器),内容格式如下:

1
clarklu.com

限制:CNAME 文件只能包含一个域名,不能同时写多个域名。

实际需求场景

假设你有以下域名:

  • 主域名clarklu.com(用于 SEO 和主要访问)
  • 次要域名luzihang.com(也想指向同一个网站)

目标

  1. 让两个域名都能访问同一个 GitHub Pages 网站
  2. 通过 DNS 配置实现多域名绑定
  3. 可选:使用 301 重定向统一 SEO(推荐)

解决方案:通过 DNS 配置多域名绑定

核心思路

虽然 GitHub Pages 的 CNAME 文件只能写一个域名,但我们可以:

  1. CNAME 文件:只写主域名(如 clarklu.com
  2. DNS 配置:让多个域名都通过 CNAME 记录指向 luzihang123.github.io
  3. Cloudflare 重定向(可选):将次要域名 301 重定向到主域名,优化 SEO

方案架构图

1
2
3
4
5
6
7
8
9
clarklu.com (主域名)
├── CNAME 文件: clarklu.com
├── DNS: CNAME → luzihang123.github.io
└── GitHub Pages 正常服务

luzihang.com (次要域名)
├── DNS: CNAME → luzihang123.github.io
├── 选项 A: 直接访问(两个域名都可用)
└── 选项 B: 301 重定向到 clarklu.com(推荐,SEO 优化)

步骤一:配置 GitHub Pages CNAME 文件

1. 在 Hexo 项目中创建 CNAME 文件

如果你使用 Hexo,在 source/ 目录创建 CNAME 文件:

1
2
cd /path/to/your/hexo/site
echo "clarklu.com" > source/CNAME

2. 在 GitHub 仓库中验证

部署后,在 GitHub 仓库中应该能看到 CNAME 文件,内容为:

1
clarklu.com

3. 在 GitHub Pages 设置中验证

  1. 访问:https://github.com/username/luzihang123.github.io/settings/pages
  2. Custom domain 部分应该显示 clarklu.com
  3. 确保 Enforce HTTPS 已启用

步骤二:配置 DNS 让多个域名指向 GitHub Pages

在 Cloudflare 中配置 DNS

1. 主域名(clarklu.com)DNS 配置

1
2
3
4
5
类型: CNAME
名称: @ (或 clarklu.com)
目标: luzihang123.github.io
代理状态: 已代理(橙色云朵)
TTL: Auto

2. 次要域名(luzihang.com)DNS 配置

1
2
3
4
5
类型: CNAME
名称: @ (或 luzihang.com)
目标: luzihang123.github.io
代理状态: 已代理(橙色云朵)
TTL: Auto

重要:两个域名都指向同一个 GitHub Pages 地址,但只有主域名在 CNAME 文件中。

配置结果

配置完成后:

  • clarklu.com → 可以正常访问(CNAME 文件中的域名)
  • luzihang.com → 也可以访问(通过 DNS CNAME 指向)
  • ⚠️ 两个域名显示相同内容,可能影响 SEO(重复内容)

步骤三:SEO 优化 - 使用 301 重定向(推荐)

为了避免重复内容影响 SEO,建议将次要域名通过 301 重定向指向主域名。这样可以将 SEO 权重集中到主域名,同时避免搜索引擎将两个域名视为重复内容。

为什么需要 301 重定向?

  1. 传递 SEO 权重:301 重定向会将原域名的 SEO 权重传递给目标域名
  2. 避免重复内容:防止搜索引擎将两个域名视为重复内容
  3. 统一流量:将所有流量集中到主域名,提高主域名的排名

方案一:使用 Cloudflare 页面规则(Page Rules)- 推荐

优点

  • ✅ 配置简单直观
  • ✅ 免费计划支持(最多 3 条规则)
  • ✅ 语法简单,使用 $1 自动处理路径和查询字符串
  • ✅ 稳定可靠,兼容性好

缺点

  • ❌ 免费计划规则数量有限(3 条)
  • ❌ 功能相对简单,不支持复杂逻辑

配置步骤

1. 进入页面规则设置

  1. 登录 Cloudflare 控制台
  2. 选择需要配置的域名(如 luzihang.com
  3. 左侧菜单:规则页面规则(Rules → Page Rules)
  4. 点击 创建页面规则(Create Page Rule)

2. 配置重定向规则

规则 1:主域名重定向

1
2
3
4
5
URL 匹配模式: luzihang.com/*
设置:
- 转发 URL(Forwarding URL)
- 301 永久重定向(301 - Permanent Redirect)
- 目标 URL: https://clarklu.com/$1

规则 2:www 子域名重定向(可选)

1
2
3
4
5
URL 匹配模式: www.luzihang.com/*
设置:
- 转发 URL
- 301 永久重定向
- 目标 URL: https://clarklu.com/$1

3. 保存并部署

点击 保存并部署(Save and Deploy),规则通常在几分钟内生效。

配置示例截图说明

  • URL 模式:使用通配符 luzihang.com/* 匹配所有路径
  • 目标 URLhttps://clarklu.com/$1,其中 $1 会自动替换为原始路径和查询参数
  • 状态码:选择 301 永久重定向,有利于 SEO

测试验证

配置完成后,测试以下 URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试根域名
curl -I https://luzihang.com
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/

# 测试带路径的 URL
curl -I https://luzihang.com/about
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/about

# 测试带查询参数的 URL
curl -I "https://luzihang.com/page?param=1"
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/page?param=1

方案二:使用 Cloudflare 重定向规则(Redirect Rules)

优点

  • ✅ 功能更强大,支持复杂表达式
  • ✅ 可以设置多个匹配条件
  • ✅ 支持 OR/AND 逻辑组合
  • ✅ 付费计划支持更多规则

缺点

  • ❌ 表达式语法复杂,容易出错
  • ❌ 免费计划可能不支持复杂表达式
  • ❌ 配置相对复杂

配置步骤

1. 进入重定向规则设置

  1. 登录 Cloudflare 控制台
  2. 选择域名 luzihang.com
  3. 左侧菜单:规则重定向规则(Rules → Redirect Rules)
  4. 点击 创建规则(Create Rule)

2. 配置匹配条件

方式一:使用通配符模式

1
2
匹配类型: 通配符模式(Wildcard pattern)
URL 模式: luzihang.net/*

方式二:使用自定义筛选表达式(推荐)

选择 自定义筛选表达式(Custom filter expression),然后配置匹配条件:

条件 1:

1
2
3
字段: 主机名(Hostname)
运算符: 等于(Equals)
值: luzihang.net

点击 Or 按钮添加第二个条件:

条件 2:

1
2
3
字段: 主机名(Hostname)
运算符: 等于(Equals)
值: www.luzihang.net

表达式预览应该自动显示:

1
(http.host eq "luzihang.net") or (http.host eq "www.luzihang.net")

如果需要编辑表达式,可以点击 编辑表达式(Edit expression)链接手动修改。

3. 配置重定向操作

则…(Then…)部分,配置 URL 重定向:

推荐配置:使用动态重定向保留路径

1
2
3
4
类型: 动态(Dynamic)
表达式: concat("https://clarklu.com", http.request.uri.path)
状态代码: 301
保留查询字符串: ✅ 勾选

表达式说明

  • concat() 函数用于拼接字符串
  • "https://clarklu.com" 是目标域名
  • http.request.uri.path 是原始请求的路径部分
  • 勾选 保留查询字符串 后,查询参数会自动保留

完整表达式示例

如果还需要手动处理查询字符串(可选,通常不需要):

1
concat("https://clarklu.com", http.request.uri.path, if(len(http.request.uri.query) > 0, concat("?", http.request.uri.query), ""))

但通常使用 concat("https://clarklu.com", http.request.uri.path) 并勾选 保留查询字符串 就足够了。

配置截图说明

  • 匹配条件:使用 OR 连接两个主机名条件
  • 重定向类型:选择 动态(Dynamic)
  • 表达式concat("https://clarklu.com", http.request.uri.path)
  • 状态代码:选择 301 永久重定向
  • 保留查询字符串:勾选此选项

4. 保存并部署

配置完成后,点击 部署(Deploy)按钮保存规则。规则通常在几分钟内生效。

配置示例说明

根据实际配置截图,完整的重定向规则配置如下:

规则名称

1
Redirect luzihang.net to clarklu.com

匹配条件

  • 使用自定义筛选表达式
  • 条件:(http.host eq "luzihang.net") or (http.host eq "www.luzihang.net")

重定向操作

  • 类型:动态(Dynamic)
  • 表达式:concat("https://clarklu.com", http.request.uri.path)
  • 状态代码:301
  • 保留查询字符串:已勾选

测试验证

配置完成后,测试以下 URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试根域名
curl -I https://luzihang.net
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/

# 测试带路径的 URL
curl -I https://luzihang.net/about
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/about

# 测试带查询参数的 URL
curl -I "https://luzihang.net/page?param=1"
# 应该返回: HTTP/1.1 301 Moved Permanently
# Location: https://clarklu.com/page?param=1

常见错误及解决方案

错误 1:表达式语法错误

如果使用复杂的表达式可能遇到错误:

1
错误信息: 'clarklu.com' is not a valid value for target_url because could not parse filter value expression

解决方案

  • 使用推荐的表达式:concat("https://clarklu.com", http.request.uri.path)
  • 确保使用 http.request.uri.path 而不是 ${uri.path} 或其他语法
  • 勾选 保留查询字符串 选项,而不是在表达式中手动处理

错误 2:unknown identifier

1
错误信息: Filter parsing error: unknown identifier

解决方案

  • 检查变量名是否正确(使用 http.host 而不是 host
  • 使用 http.request.uri.path 而不是 uri.path
  • 确保表达式语法正确,使用 concat() 函数

完整配置检查清单

在开始配置前,确保以下准备工作已完成:

  • GitHub Pages 仓库已创建并可以正常访问
  • 两个域名都已添加到 Cloudflare
  • DNS 记录:两个域名都配置了 CNAME 指向 luzihang123.github.io
  • SSL/TLS:两个域名都设置为 Full 或 Full (strict)
  • CNAME 文件:只包含主域名(如 clarklu.com

配置步骤检查清单

  • 步骤一:在 GitHub Pages 中配置 CNAME 文件(主域名)
  • 步骤二:在 Cloudflare 中配置两个域名的 DNS 记录
  • 步骤三:配置 301 重定向(可选,但推荐用于 SEO)
  • 测试验证:所有 URL 正确重定向
  • Google Search Console:添加两个域名并设置首选域名

SEO 最佳实践

  1. 选择主域名:确定一个主域名用于 SEO(如 clarklu.com
  2. 使用 301 重定向:不要使用 302 临时重定向
  3. 保留路径和参数:确保用户体验,保留原始 URL 的路径
  4. 在 Google Search Console 中设置
    • 添加两个域名
    • 设置首选域名为主域名
    • 提交两个域名的 sitemap

Google Search Console 配置

  1. 访问 Google Search Console
  2. 添加属性:clarklu.com(主域名)
  3. 添加属性:luzihang.com(验证所有权)
  4. 在设置中指定首选域名为 clarklu.com

重定向方案对比

特性 页面规则(方案一) 重定向规则(方案二)
配置难度 ⭐ 简单 ⭐⭐⭐ 复杂
免费计划支持 ✅ 支持(3条规则) ⚠️ 功能有限
保留路径 ✅ 自动(使用 $1) ✅ 支持(使用 concat 表达式)
稳定性 ✅ 非常稳定 ✅ 稳定(表达式正确时)
推荐度 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐

推荐方案

对于大多数用户,推荐使用方案一(页面规则),原因:

  1. ✅ 配置简单,不容易出错
  2. ✅ 免费计划完全支持
  3. ✅ 自动处理路径和查询参数
  4. ✅ 稳定可靠

方案二(重定向规则)适合需要更精细控制或使用自定义筛选表达式的场景。使用正确的表达式语法 concat("https://clarklu.com", http.request.uri.path) 可以稳定工作。

总结

虽然 GitHub Pages 的 CNAME 文件只能包含一个域名,但通过 DNS 配置和 Cloudflare 重定向规则,我们可以轻松实现多域名绑定:

  1. CNAME 文件:只写主域名(如 clarklu.com
  2. DNS 配置:让多个域名都通过 CNAME 记录指向 luzihang123.github.io
  3. 301 重定向(推荐):将次要域名重定向到主域名,优化 SEO

这样既满足了多域名访问的需求,又避免了 SEO 重复内容的问题。对于大多数用户,使用 Cloudflare 页面规则实现 301 重定向是最简单可靠的选择


相关资源

标签:#GitHub Pages #多域名绑定 #Cloudflare #DNS配置 #SEO #301重定向