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

如何设置GitHub页面以将DNS请求从子域(例如www)重定向到顶级域(TLD、Apex记录)?,dns,github-pages,Dns,Github Pages,如何配置DNS服务提供商,使对www.example.com和example.com的请求都会显示托管在GitHub页面上的网站?打开网站时,浏览器的地址栏应包含example.com 我的DNS服务提供商是gandi.net。它不支持别名DNS记录类型。简短回答 步骤1:将一个新文件CNAME添加到GitHub页面存储库中,其中只包含一行:顶级域名。 例如: 步骤2:[可选]但强烈建议 2.1:从DNS配置中删除类型为A的所有其他顶级记录(前缀为@) 2.2:删除二级域www的CNAME记录(

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

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

简短回答 步骤1:将一个新文件
CNAME
添加到GitHub页面存储库中,其中只包含一行:顶级域名。

例如:

步骤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.
您的\u github\u用户名
替换为实际的github用户名

步骤4:等待DNS更改传播。

DNS更改不会立即生效。它们可能需要一整天的时间来繁殖


长话短说 这个问题有两个方面。一个是DNS配置本身。另一个是GitHub页面转发HTTP请求的方式

我们需要知道一些事情来理解GitHub在文档中试图说什么

DNS条目类型 我们感兴趣的DNS记录有两种类型:
CNAME
A

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

DNS负载平衡 GitHub有一个中心URL地址,它接受GitHub页面的所有DNS请求:
http://username.github.io
。该URL将根据您的地理位置解析为不同的IP地址。GitHub页面上托管的网站是
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页面上托管的网站将从中心GitHub页面服务器下载。如果GitHub Pages DNS服务器(
x.x.x.153
)由于某种原因关闭,则所有使用固定GitHub Pages IP地址的自定义域都将无法访问(它们的DNS请求将无法解析),这样的风险很小

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

GitHub页面如何处理HTTP请求 对
您的\u github\u username.github.io.
的DNS请求被解析为IP地址后,例如
185.199.108.153
您的浏览器使用HTTP头
主机
向该服务器发送HTTP请求。下面是加载同一网站的
curl
示例(如果您在代理服务器后面,这些示例可能不起作用):

通过这种方式,GitHub页面服务器知道为哪个用户网站提供服务

如果您的
CNAME
文件包含
example.com
但请求
www.example.com
,GitHub Pages服务器将自动将HTTP请求重定向到顶级域

如果
CNAME
文件包含
www.example.com
,但HTTP请求中的头
Host
包含
example.com
,则同样有效

为什么我不能将接受顶级请求(
@
)的
CNAME
记录条目添加到我的DNS配置中? 引用GitHub页面文档:

警告:不要为自定义apex域创建CNAME记录!这样做可能会导致该域上的其他服务(如电子邮件)出现问题


参考资料:


这是我很久以来看到的最好答案。这是一个很好的参考点。我甚至可以用本文中的一些内容更新我们的帮助文章。:-)@乔尔·格洛维尔谢谢乔尔!我认为更新GH页面文档是一个好主意!大多数人都会先阅读官方文件。一个简短的提示(发生在我身上):在所有情况下,回购协议中都需要一个CNAME文件(子域的CNAME记录或apex的记录,别名记录)。我必须为apex域设置一个A记录,所以跳过了CNAME文件部分。我知道我遗漏了什么:)@JayZelenkov,谢谢,这正是我想要的!出于好奇,您知道我们如何将站点设置为使用HTTPS而不是HTTP吗?小心!本文中的IP地址不支持HTTPS,因为它们不指向GitHubs CDN。到目前为止,正确的IP地址为185.199.108.153、185.199.109.153、185.199.110.153、185.199.111.153(有关更多信息,请参阅)。
@        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.
$> 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/