GitHub Pages 多域名绑定指南:突破 CNAME 单域名限制
GitHub Pages 多域名绑定指南:突破 CNAME 单域名限制
前言
GitHub Pages 是一个优秀的静态网站托管服务,但有一个限制:CNAME 文件只能包含一个域名。如果你有多个域名(如 clarklu.com 和 luzihang.com)想要指向同一个 GitHub Pages 网站,本文提供了完整的解决方案。
GitHub Pages 的 CNAME 限制
为什么只能有一个域名?
GitHub Pages 使用 CNAME 文件来指定自定义域名。这个文件位于仓库的根目录或 source/ 目录(如果使用 Hexo 等静态网站生成器),内容格式如下:
1 | clarklu.com |
限制:CNAME 文件只能包含一个域名,不能同时写多个域名。
实际需求场景
假设你有以下域名:
- 主域名:
clarklu.com(用于 SEO 和主要访问) - 次要域名:
luzihang.com(也想指向同一个网站)
目标:
- 让两个域名都能访问同一个 GitHub Pages 网站
- 通过 DNS 配置实现多域名绑定
- 可选:使用 301 重定向统一 SEO(推荐)
解决方案:通过 DNS 配置多域名绑定
核心思路
虽然 GitHub Pages 的 CNAME 文件只能写一个域名,但我们可以:
- CNAME 文件:只写主域名(如
clarklu.com) - DNS 配置:让多个域名都通过 CNAME 记录指向
luzihang123.github.io - Cloudflare 重定向(可选):将次要域名 301 重定向到主域名,优化 SEO
方案架构图
1 | clarklu.com (主域名) |
步骤一:配置 GitHub Pages CNAME 文件
1. 在 Hexo 项目中创建 CNAME 文件
如果你使用 Hexo,在 source/ 目录创建 CNAME 文件:
1 | cd /path/to/your/hexo/site |
2. 在 GitHub 仓库中验证
部署后,在 GitHub 仓库中应该能看到 CNAME 文件,内容为:
1 | clarklu.com |
3. 在 GitHub Pages 设置中验证
- 访问:
https://github.com/username/luzihang123.github.io/settings/pages - 在 Custom domain 部分应该显示
clarklu.com - 确保 Enforce HTTPS 已启用
步骤二:配置 DNS 让多个域名指向 GitHub Pages
在 Cloudflare 中配置 DNS
1. 主域名(clarklu.com)DNS 配置
1 | 类型: CNAME |
2. 次要域名(luzihang.com)DNS 配置
1 | 类型: CNAME |
重要:两个域名都指向同一个 GitHub Pages 地址,但只有主域名在 CNAME 文件中。
配置结果
配置完成后:
- ✅
clarklu.com→ 可以正常访问(CNAME 文件中的域名) - ✅
luzihang.com→ 也可以访问(通过 DNS CNAME 指向) - ⚠️ 两个域名显示相同内容,可能影响 SEO(重复内容)
步骤三:SEO 优化 - 使用 301 重定向(推荐)
为了避免重复内容影响 SEO,建议将次要域名通过 301 重定向指向主域名。这样可以将 SEO 权重集中到主域名,同时避免搜索引擎将两个域名视为重复内容。
为什么需要 301 重定向?
- 传递 SEO 权重:301 重定向会将原域名的 SEO 权重传递给目标域名
- 避免重复内容:防止搜索引擎将两个域名视为重复内容
- 统一流量:将所有流量集中到主域名,提高主域名的排名
方案一:使用 Cloudflare 页面规则(Page Rules)- 推荐
优点
- ✅ 配置简单直观
- ✅ 免费计划支持(最多 3 条规则)
- ✅ 语法简单,使用
$1自动处理路径和查询字符串 - ✅ 稳定可靠,兼容性好
缺点
- ❌ 免费计划规则数量有限(3 条)
- ❌ 功能相对简单,不支持复杂逻辑
配置步骤
1. 进入页面规则设置
- 登录 Cloudflare 控制台
- 选择需要配置的域名(如
luzihang.com) - 左侧菜单:规则 → 页面规则(Rules → Page Rules)
- 点击 创建页面规则(Create Page Rule)
2. 配置重定向规则
规则 1:主域名重定向
1 | URL 匹配模式: luzihang.com/* |
规则 2:www 子域名重定向(可选)
1 | URL 匹配模式: www.luzihang.com/* |
3. 保存并部署
点击 保存并部署(Save and Deploy),规则通常在几分钟内生效。
配置示例截图说明
- URL 模式:使用通配符
luzihang.com/*匹配所有路径 - 目标 URL:
https://clarklu.com/$1,其中$1会自动替换为原始路径和查询参数 - 状态码:选择
301永久重定向,有利于 SEO
测试验证
配置完成后,测试以下 URL:
1 | # 测试根域名 |
方案二:使用 Cloudflare 重定向规则(Redirect Rules)
优点
- ✅ 功能更强大,支持复杂表达式
- ✅ 可以设置多个匹配条件
- ✅ 支持 OR/AND 逻辑组合
- ✅ 付费计划支持更多规则
缺点
- ❌ 表达式语法复杂,容易出错
- ❌ 免费计划可能不支持复杂表达式
- ❌ 配置相对复杂
配置步骤
1. 进入重定向规则设置
- 登录 Cloudflare 控制台
- 选择域名
luzihang.com - 左侧菜单:规则 → 重定向规则(Rules → Redirect Rules)
- 点击 创建规则(Create Rule)
2. 配置匹配条件
方式一:使用通配符模式
1 | 匹配类型: 通配符模式(Wildcard pattern) |
方式二:使用自定义筛选表达式(推荐)
选择 自定义筛选表达式(Custom filter expression),然后配置匹配条件:
条件 1:
1 | 字段: 主机名(Hostname) |
点击 Or 按钮添加第二个条件:
条件 2:
1 | 字段: 主机名(Hostname) |
表达式预览应该自动显示:
1 | (http.host eq "luzihang.net") or (http.host eq "www.luzihang.net") |
如果需要编辑表达式,可以点击 编辑表达式(Edit expression)链接手动修改。
3. 配置重定向操作
在 则…(Then…)部分,配置 URL 重定向:
推荐配置:使用动态重定向保留路径
1 | 类型: 动态(Dynamic) |
表达式说明:
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 | # 测试根域名 |
常见错误及解决方案
错误 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 最佳实践
- 选择主域名:确定一个主域名用于 SEO(如
clarklu.com) - 使用 301 重定向:不要使用 302 临时重定向
- 保留路径和参数:确保用户体验,保留原始 URL 的路径
- 在 Google Search Console 中设置:
- 添加两个域名
- 设置首选域名为主域名
- 提交两个域名的 sitemap
Google Search Console 配置
- 访问 Google Search Console
- 添加属性:
clarklu.com(主域名) - 添加属性:
luzihang.com(验证所有权) - 在设置中指定首选域名为
clarklu.com
重定向方案对比
| 特性 | 页面规则(方案一) | 重定向规则(方案二) |
|---|---|---|
| 配置难度 | ⭐ 简单 | ⭐⭐⭐ 复杂 |
| 免费计划支持 | ✅ 支持(3条规则) | ⚠️ 功能有限 |
| 保留路径 | ✅ 自动(使用 $1) | ✅ 支持(使用 concat 表达式) |
| 稳定性 | ✅ 非常稳定 | ✅ 稳定(表达式正确时) |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
推荐方案
对于大多数用户,推荐使用方案一(页面规则),原因:
- ✅ 配置简单,不容易出错
- ✅ 免费计划完全支持
- ✅ 自动处理路径和查询参数
- ✅ 稳定可靠
方案二(重定向规则)适合需要更精细控制或使用自定义筛选表达式的场景。使用正确的表达式语法 concat("https://clarklu.com", http.request.uri.path) 可以稳定工作。
总结
虽然 GitHub Pages 的 CNAME 文件只能包含一个域名,但通过 DNS 配置和 Cloudflare 重定向规则,我们可以轻松实现多域名绑定:
- CNAME 文件:只写主域名(如
clarklu.com) - DNS 配置:让多个域名都通过 CNAME 记录指向
luzihang123.github.io - 301 重定向(推荐):将次要域名重定向到主域名,优化 SEO
这样既满足了多域名访问的需求,又避免了 SEO 重复内容的问题。对于大多数用户,使用 Cloudflare 页面规则实现 301 重定向是最简单可靠的选择。
相关资源
标签:#GitHub Pages #多域名绑定 #Cloudflare #DNS配置 #SEO #301重定向