如何配置 DNS 服务提供商,以便对 www.example.com
和 example.com
的请求都将显示托管在 GitHub Pages 上的网站?打开网站时,我的浏览器地址栏应包含 example.com
。
我的 DNS 服务提供商是 gandi.net
。它不支持 ALIAS
DNS 记录类型。
最佳答案
简短回答
第 1 步:将新文件 CNAME
添加到您的 GitHub Pages 存储库,其中仅包含一行:您的顶级域名。
例如:
example.com
第 2 步:[可选]但强烈推荐
2.1:从 DNS 配置中删除 A
类型的所有其他顶级记录(以 @ 为前缀)。
2.2:删除二级域 www
的 CNAME
记录(如果存在)。
第 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 记录有两种类型:CNAME
和 A
。
A
也称为 Apex
或有时称为根条目
。它将请求转发到指定的固定 IP 地址。 CNAME
条目将请求转发到指定的 URL(实际有效的纯文本 URL,而不是 IP 地址)。
DNS负载均衡
GitHub 有一个中央 URL 地址,用于接受 GitHub 页面的所有 DNS 请求:http://username.github.io
。该 URL 将根据您的地理位置解析为不同的 IP 地址。 GitHub Pages 上托管的网站是 HTML
、CSS
和 JS
文件的简单集合。 GitHub 将这些文件分发到全局不同的服务器。这样,当您的浏览器从欧洲发送请求时,它会从欧洲的服务器接收数据。这同样适用于来自亚洲和美国的请求。
GitHub 想要表达的内容
由于 DNS 中的 A
记录必须包含 IP 地址,并且它们必须是 185.199.108.153
或 185.199.109.153
或 185.199.110.153
或 185.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 containsexample.com
butwww.example.com
is requested.The same is valid if your
CNAME
file containswww.example.com
but the headerHost
in the HTTP request containsexample.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
关于dns - 如何设置 GitHub Pages 将 DNS 请求从子域(例如 www)重定向到顶级域(TLD、Apex 记录)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375422/