dns - 如何设置 GitHub Pages 将 DNS 请求从子域(例如 www)重定向到顶级域(TLD、Apex 记录)?

标签 dns github-pages

如何配置 DNS 服务提供商,以便对 www.example.comexample.com 的请求都将显示托管在 GitHub Pages 上的网站?打开网站时,我的浏览器地址栏应包含 example.com

我的 DNS 服务提供商是 gandi.net。它不支持 ALIAS DNS 记录类型。

最佳答案

简短回答

第 1 步:将新文件 CNAME 添加到您的 GitHub Pages 存储库,其中仅包含一行:您的顶级域名。

例如:

example.com

第 2 步:[可选]但强烈推荐

2.1:从 DNS 配置中删除 A 类型的所有其他顶级记录(以 @ 为前缀)。

2.2:删除二级域 wwwCNAME 记录(如果存在)。

第 3 步:将这 5 个条目添加到 DNS 配置的最顶部:

@        A        185.199.108.153
@        A        185.199.109.153
@        A        185.199.110.153
@        A        185.199.111.153
www      CNAME    your_github_username.github.io.

your_github_username 替换为您的实际 GitHub 用户名。

第 4 步:WAITING DNS 更改生效。

DNS 更改不会立即生效。它们可能需要一整天的时间才能传播。

<小时/>

长答案

这个问题有两个方面。一是 DNS 配置本身。另一种是 GitHub Pages 转发 HTTP 请求的方式。

我们需要了解一些事情才能理解 GitHub 在其文档中试图表达的内容。

DNS 条目类型

我们感兴趣的 DNS 记录有两种类型:CNAMEA

A 也称为 Apex 或有时称为根条目。它将请求转发到指定的固定 IP 地址。 CNAME 条目将请求转发到指定的 URL(实际有效的纯文本 URL,而不是 IP 地址)。

DNS负载均衡

GitHub 有一个中央 URL 地址,用于接受 GitHub 页面的所有 DNS 请求:http://username.github.io。该 URL 将根据您的地理位置解析为不同的 IP 地址。 GitHub Pages 上托管的网站是 HTMLCSSJS 文件的简单集合。 GitHub 将这些文件分发到全局不同的服务器。这样,当您的浏览器从欧洲发送请求时,它会从欧洲的服务器接收数据。这同样适用于来自亚洲和美国的请求。

GitHub 想要表达的内容

由于 DNS 中的 A 记录必须包含 IP 地址,并且它们必须是 185.199.108.153185.199.109.153 185.199.110.153185.199.111.153,无法将请求转发到位于欧洲或亚洲某处的服务器。您托管在 GitHub Pages 上的网站将从中央 GitHub Pages 服务器下载。存在一个小风险,如果 GitHub Pages DNS 服务器 (x.x.x.153) 由于某种原因关闭,则所有使用固定 GitHub Pages IP 地址的自定义域将无法访问(它们的 DNS 请求将无法解析) )。

这就是为什么 GitHub 强烈建议为 GitHub Pages 使用二级域名(例如 blog.example.com)或使用支持记录类型 的 DNS 服务提供商ALIAS 充当 A 记录,但将请求转发到 URL 地址(例如 username.github.io)而不是固定 IP 地址。

GitHub Pages 如何处理 HTTP 请求

your_github_username.github.io. 的 DNS 请求解析为 IP 地址后,例如185.199.108.153 您的浏览器向该服务器发送带有 HTTP header Host 的 HTTP 请求。下面是加载同一网站的 curl 示例(如果您位于代理服务器后面,这些示例可能不起作用):

$> curl --header "Host: your_github_username.github.io" http://185.199.108.153/
$> curl --header "Host: www.example.com" http://185.199.108.153/
$> curl --header "Host: example.com" http://185.199.108.153/

这样 GitHub Pages 服务器就知道要服务哪个用户网站。

GitHub Pages server will automatically redirect HTTP request to the top-level domain if your CNAME file contains example.com but www.example.com is requested.

The same is valid if your CNAME file contains www.example.com but the header Host in the HTTP request contains example.com.

为什么我无法向我的 DNS 配置添加接受顶级请求 (@) 的 CNAME 记录条目?

引用 GitHub Pages 文档:

Warning: Do not create a CNAME record for your custom apex domain! Doing so may cause issues with other services, such as email, on that domain.

<小时/>

引用文献:

Setting up a custom domain with GitHub Pages

My custom domain isn't working

Cannot access my GitHub Pages website by IP Address

关于dns - 如何设置 GitHub Pages 将 DNS 请求从子域(例如 www)重定向到顶级域(TLD、Apex 记录)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375422/

相关文章:

dns - 动态创建子域

github-pages - 如何从子文件夹运行 Svelte 应用程序?

html - 无序列表左对齐,元素符号和测试之间有巨大的空间

css - 如何链接组织github页面中的css文件

jekyll - Github Pages root 使用 Jekyll 提供 404

windows - 修改windows 7 hosts文件不生效

.net - 获取与 IP 关联的所有 DNS 记录

reactjs - 安装 gh-pages 后,React 图像未在本地加载

ruby-on-rails - 是否可以验证为使用 Rails 集成测试设置了 cookie 的域?

dns - 设置名称服务器 - 如何?