对部署到Github Pages上的博客配置自定义域名

前言

发现之前用来搞 galgame 网盘转存网站的被我废弃掉之后,多出来一个闲置的域名

就打算把我的 Hexo 博客绑定到上面,要不然每次都要 ergou10086.github.io来访问自己的博客,域名太长了。

自定义域名其实是一件比较简单的事情啊,比把hexo部署到服务器简单得多

效果就是如下了

image-20250518174351186

这里实际上你的 仓库名.github.io 这个域名并没有失效啊,只是指向了这个你自定义的域名

输入 仓库名.github.io 这个域名是会自动跳转到你自定义的域名下的,这个很重要,给需要分配子page和子域名的人说一下


购买域名

这里笔者使用的是阿里云,可能别的更便宜,我的 .cn 后缀域名现在一年要 42 块,有点贵。。。

另外还有很多人推荐的godaddy也可以。本篇以阿里云为例。

  • 首先注册阿里云账号,如果有淘宝账号的,可以直接登录。
  • 登录以后,先进行实名认证(购买域名要用到,但是域名申请备案时候还要搞一遍,那个是工信部申请备案的模板,关于如何实名验证,这里就跳过了)。

这里进入购买域名的位置

image-20250518174737096

在这搜索你想要注册的域名,建议买没有人用过的,买别人用过的一是贵,二是需要涉及过户

域名其实不贵啊,.cn.top 我都比较推荐,.xyz我看也不少人用,我的比较贵,42一年

image-20250518174824781

备案通常情况下你看他说需要好几天,最慢的其实就是申请备案要搞的那个备案申请模板,有了那个模板几分钟我的就下来了我记得。

21e582b3127625b7b97db3243c13b05d

建议网站上线之后把备案信息放在你的网站页脚处。


配置域名绑定

win+R快捷键打开“运行”窗口,输入cmd运行命令行控制台。

ping 你的仓库名.github.io 就能看到 GitHub Page 给你绑的是什么 ip 了

0d65b4836bd6abee004f93f572b864d8

这里其实涉及到一些 GitHub Page 的一些配置信息,详情可以访问 GitHub文档,我其实就是照着这个配置的

https://docs.github.com/zh/pages/configuring-a-custom-domain-for-your-github-pages-site

进入域名解析列表并对购买的域名进行解析

控制台,有个域名与网站,进去

image-20250518175642122
image-20250518175709843

点击解析配置相应的配置

image-20250518175813533

配置两条解析

  • 主机记录 www;记录类型 CNAME;设置解析请求需要高级的版本,自动默认;记录值 你的仓库名.github.io;TTL这个默认就是10分钟
    • GitHub Pages 要求用户通过 CNAME 记录将自定义域名的 www 子域名指向其默认域名(*.github.io)。
    • 这样配置后,当用户访问 www.yourdomain.com 时,域名系统会将请求转发到 GitHub 服务器,由 GitHub 处理并返回网站内容。
    • GitHub Pages 的服务器 IP 地址可能会动态变化,使用 CNAME 记录无需手动更新 IP,GitHub 会自动维护其默认域名与实际 IP 的映射关系,避免因 IP 变动导致网站无法访问。
  • 主机记录 @;记录类型 A;设置解析请求需要高级的版本,自动默认;记录值 上面ping出的IP地址;TTL这个默认就是10分钟
    • 通过 A 记录指向 IP,确保根域名直接访问正常。
    • 根域名(如 yourdomain.com)无法直接使用 CNAME 记录,因此需要通过 A 记录指向 GitHub Pages 的 IP 地址。这里是为了兼容不支持 CNAME 的场景
    • 通过 ping yourrepo.github.io 可以获取 GitHub Pages 当前的服务器 IP(可能返回多个 IP,需全部配置),确保根域名能正确解析到服务器。
  • 若需启用 HTTPS,需在 GitHub Pages 中配置自定义域名并等待其自动颁发 SSL 证书(需确保解析记录已生效)。

关于记录类型其实有些话要说,你看很多人配置,配置主机记录 @的时候用的也是记录类型 CNAME,然后记录值 你的仓库名.github.io,其实这个是无所谓的,在这里我用的是上面ping出的IP地址,主机记录www的配置也可以写成 你ping出的域名,然后记录类型写成A

这俩写法都可以,所以我交叉着用了

你可以点击生效检测,看看你的DNS生效了吗,没生效的情况大部分的备案没过

image-20250518180603900

配置 GitHub 指向你的域名

到这里阿里云上的配置就结束了

新建 CNAME 文件

我们需要新建一个 CNAME 文件,注意是 文件 需要把文件后缀名消掉

image-20250518180758215

如果不做这一步,每次hexo d部署到 github上以后,对应仓库的域名设置里的域名会被重置回原来username.github.io,你需要再次设置成你的域名,很麻烦。

配置 apex 域

这里是 GitHub 文档给出的配置教程

https://docs.github.com/zh/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site

image-20250518175545261

可以参考一下

配置好了以后,登录github,进入到博客站点对应的仓库,对域名进行设置:27462e49acc052ac610362216916469c

进入 GitHUb Pages

79504701a1eef5d4ae12c35683e2f70b

不要吐槽的我用的汉化插件,我英语是真不行

自定义域的部分输入你的域名,这里会自动进行 DNS 解析,我这里第一次失败是因为我挂着梯子

1bd1931bd6841afef6c19d18939221c2

到此,域名就与你的博客站点绑定上了。

输入你的域名查看能不能正常跳转


Https

如果GitHub上可以开启Https直接开启即可,如果不能的话可以在阿里云申请一个免费的SSL证书

img

为了部署到云服务器上配置自定义域名

我以一个二级域名为例子了

配置域名解析

首先登录阿里云控制台,进入域名控制台,配置域名解析

image-20260120091415479

然后配置域名解析,配置一条 A 记录,主机记录填写你的二级域名前缀,记录值填写你的云服务器公网 IP

image-20260120091743121

保存解析,等待 5-10 分钟让解析生效,然后通过ping blog.yourdomain.cn验证是否指向服务器 IP

image-20260120091907869

然后这里就可以开始着手配置云服务器了

部署到云服务器

根据二级域名建站

首先确保你的云服务器(以CentOS为例子)具备基础运行环境:

1
2
3
4
5
6
7
8
9
10
# 更新系统包(Ubuntu/Debian)
sudo apt update && sudo apt upgrade -y

# 安装Node.js(Hexo运行依赖)、Git(部署用)、Nginx(Web服务器)
sudo apt install nodejs npm git nginx -y

# 验证安装
node -v # 应显示Node.js版本号
npm -v # 应显示npm版本号
nginx -v # 应显示Nginx版本号

然后找到你的 Hexo 配置文件_config.yml,修改一些部署的配置

image-20260120092611635

找到deploy部分,新增云服务器部署配置,我保留原 GitHub Pages 配置,然后部署到云服务器同时会部署到GitHub Pages,不影响原访问

1
2
3
4
5
6
7
8
deploy:
- type: git
repository: git@github.com:ergou10086/ergou10086.github.io.git
branch: main
- tyep: git
repository: root@152.136.245.180:/www/wwwroot/blog.ergoutreegal.cn
branch: master
message: "Deploy to cloud server: {{ now('YYYY-MM-DD HH:mm:ss') }}"

我使用宝塔去做相关的配置了,也就是使用 Nginx 建站

image-20260120092401573

然后编辑其中的配置,我把我的配置列出来进行参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
server
{
listen 80;
listen [::]:80;
server_name blog.ergoutreegal.cn;

index index.html index.htm default.htm default.html;
# 你的Hexo静态文件存放目录
root /www/wwwroot/blog.ergoutreegal.cn;

#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除并保持这段设置在优先级高的位置
include /www/server/panel/vhost/nginx/well-known/blog.ergoutreegal.cn.conf;
#CERT-APPLY-CHECK--END

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END

#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

# Hexo核心路由规则(解决刷新404)
location / {
# Hexo单页应用必需,处理路由跳转
try_files $uri $uri/ /index.html;
}

#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/html_blog.ergoutreegal.cn.conf;
#REWRITE-END

#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}

#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}

#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}

# 静态资源缓存优化(保留原有配置,适配Hexo静态资源)
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}

location ~ .*\\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}

access_log /www/wwwlogs/blog.ergoutreegal.cn.log;
error_log /www/wwwlogs/blog.ergoutreegal.cn.error.log;
}

其中不少宝塔相关的内容,核心的就是那个重定向

1
2
3
location / {
try_files $uri $uri/ /index.html;
}

Hexo 是基于单页路由的静态博客,直接刷新非首页(如文章页)会触发 Nginx 404,这行规则会让 Nginx 优先查找对应文件,找不到则重定向到index.html,由 Hexo 前端路由处理,彻底解决刷新 404 问题。

然后宝塔的目录有安全策略,它被设置了不可修改 / 删除的特殊属性

image-20260120093729929

别忘了重启重载nginx配置

image-20260120094347240

出现这一步说明建站成功了

配置对应的仓库

创建一个新的文件夹,作为仓库

然后在云服务器上初始化 git 仓库,注意清空该文件夹,因为 Git 默认禁止向非裸仓库(即有工作区的仓库)推送代码

1
2
# 初始化git仓库
git init --bare {自定义仓库名name}.git

--bare表示创建的是 裸仓库

然后配置 Git 钩子(hooks)

执行下面的命令,在自动生成的blog.git/hooks 目录下,也就是我们创建的作为仓库的文件夹,创建一个新的钩子文件

1
vim /edr/ergoutreegal/repo/blog.git/hooks/post-receive

然后为这个钩子编辑这样的一个命令

1
git --work-tree=/www/wwwroot/blog.ergoutreegal.cn --git-dir=/edr/ergoutreegal/repo/blog.git checkout -f

主要用于代码推送到服务器 git 仓库后,自动将代码同步到网站运行目录,前面是指定 Git 的工作目录,即网站实际运行的目录,然后后面是指定 Git 仓库的裸仓库目录

将文件保存(方法参加上文)后,赋予该文件可执行权限:

1
chmod +x /edr/ergoutreegal/repo/blog.git/hooks/post-receive

然后可以开始着手配置 SSH 免密登录

1
2
# 替换成你的服务器 IP,测试 SSH 连接
ssh root@152.136.245.180

配置 SSH 免密登录

本地生成 SSH 密钥

1
2
# 一路回车,默认生成 C:\Users\你的用户名\.ssh\id_rsa(私钥)和 id_rsa.pub(公钥)
ssh-keygen -t ed25519 -C "你的邮箱"

然后把本地公钥复制到服务器

再次测试 SSH 连接:ssh root@152.136.245.180,能免密登录说明配置成功。