lmk123 / blog

个人技术博客,博文写在 Issues 里。
https://github.com/lmk123/blog/issues
623 stars 35 forks source link

更换划词翻译网站域名 #99

Open lmk123 opened 2 years ago

lmk123 commented 2 years ago

划词翻译的网站目前挂在我自己的个人域名下 https://hcfy.limingkai.cn,但是这样有一些问题:

于是,我购买了新的域名 hcfy.app 并准备将网站迁移到新域名上,顺便将划词翻译服务器的接口地址 hs-api.limingkai.cn 也迁移到 api.hcfy.app。

文档站的迁移

一、将新域名添加进 Netilfy

首先得让新域名也指向文档站才行。

划词翻译的文档站托管在 Netilfy 上,要让 hcfy.app 也指向文档站,只需要将它添加进 Netlify 即可。另外,我还将 www.hcfy.app 也加进去了,因为当我将 hcfy.app 设置为主要地址之后,www.hcfy.app 就会自动跳转到 hcfy.app。

但是,我还不能将主要访问地址从 hcfy.limingkai.cn 切换为 hcfy.app,因为服务器上的地址还没有变更。

二、将新域名加入服务器代码中

由于“忘记密码”的功能是写在文档站里的,所以服务器里允许了来自 hcfy.limingkai.cn 的跨域请求,现在如果要将文档站的访问地址改为新域名,那么也要将服务器里的允许跨域的地址更新一下。

开始迁移

最终的迁移步骤如下:

  1. 将新域名加入到服务器的允许跨域访问的地址列表里并发布代码。
  2. 等代码上线之后,去 Netlify 里将主要地址切换到新域名。
  3. 让 hcfy.limingkai.cn 跳转到新域名。

这一切完成之后,就该迁移其它部分了,例如 Google Analytics 也应该换地址了。

遇到的问题

在经过一段时间测试后,我发现 https://hcfy.app 偶尔会需要开代理才能打开,而 https://www.hcfy.app 则没有这个问题。

hcfy.app 使用 A 记录指向了 Netlify 提供的 IP 75.2.60.5,即使在出现问题的时候,这个 IP 也是可以 ping 通的,所以我估计是这个 IP 被墙了。这样一来,我只能把 hcfy.app 重定向到 www.hcfy.app 了,但是在 DNSPod 里,重定向功能只开放给备案了的域名,于是我决定将域名的 DNS 解析到 CloudFlare 里。

在 CloudFlare 里配置好 www 的 CNAME 记录之后,我访问了一下 www.hcfy.app,但是显示了一个跟 HTTPS 证书有关的 Error 525 的错误。经过一番搜索,我发现了这个地址:Why isn’t my SSL certificate provisioning automatically with Cloudflare & Netlify?

简单点说,默认情况向下,CloudFlare 在用户和 Netlify 做了一层代理,而 CloudFlare 自动给域名安装了 SSL 证书,但是 Netlify 也安装了证书,所以造成冲突了。而且,上面的链接中也提到不应该给 Netilfy 开启 CloudFlare 的代理,因为 Netlify 本身就有加速服务,这相当于给源站套了两层加速,但这没必要。

解决办法也很简单,只需要在 CloudFlare 里给 DNS 记录关闭代理就行了。关闭之后,会显示为“仅限 DNS”。

配置好 www.hcfy.app 之后,接下来就是在 CloudFlare 里添加两条页面转发规则了:

http://hcfy.app/*  301  https://www.hcfy.app/$1
https://hcfy.app/*  301  https://www.hcfy.app/$1

可是我还是想直接在 hcfy.app 显示内容

域名前多出的 www 总让我觉得不舒服,但是在查询了 Netlify 的文档(Apex domains and www subdomains)之后,我发现 CloudFlare 支持给顶级域名设置 CNAME,它们称之为 CNAME 扁平化的技术。

于是我删除了前面设置的页面跳转规则,然后将 hcfy.app 的 A 记录改为 CNAME 并指向了 Netlify,大约 5 分钟后,果然可以正常访问了——不得不感慨一句真香。

将 hcfy.limingkai.cn 跳转到 hcfy.app

当我在 DNSPod 上设置将 hcfy.limingkai.cn 跳转到 hcfy.app 的时候,DNSPod 告诉我 hcfy.app 没备案所以不能跳转。现在有三个办法:

  1. 在 Netlify 里做跳转。尝试添加了如下配置可是不起作用。
[[redirects]]
  from = "https://hcfy.limingkai.cn/*"
  to = "https://hcfy.app/:splat"
  1. 在 js 代码里做跳转。虽然能达到效果,但这毕竟不是 301 重定向,一来对搜索引擎不友好,二来网站会被加载两次,会稍微降低访问速度。
  2. 把 limingkai.cn 也从 DNSPod 迁移到 CloudFlare 然后配置 301。这是最好的办法,对搜索引擎也很友好,但我暂时没有这么做。原因之一是 hs-api.limingkai.cn 用 acme.sh 生成了证书,所以估计迁移过去之后得重新配置一下 acme.sh,而且还不知道会不会影响到 hs-api.limingkai.cn 的解析。acme.sh 配置方式见 #85

之后要做的事情

301 跳转的具体执行步骤

  1. 先把 DNSPod 里的记录全都填写进 CloudFlare 里,并提前设置好将 hcfy.limingkai.cn 跳转到 hcfy.app
  2. 等到低峰期的时候,将 nameservers 改为 CloudFlare 的,观察是否有问题
  3. 在服务器上用 acme.sh 的 CloudFlare 的方式重新生成 hs-api.limingkai.cn 的证书并重启服务器看看有没有问题

接口地址的迁移

文档站的迁移很简单,但是接口地址的迁移让我犯了难。

用户认证的 cookie 是保存在 hs-api.limingkai.cn 的,如果我将接口地址切换到新域名,那么已经登录的用户全都需要重新登录一次,这显然是不行的。

然后我想到让 hs-api.limingkai 和 api.hcfy.app 共存。Node.js 确实支持给同一个服务器配置多个 SSL 证书,但是这样治标不治本——我还是不能把代码里的接口地址改为新域名。

暂时没想到什么好的办法,接口地址的迁移只能先搁置了。