背景

上周六(5月23日),纠结了很久,终于还是决定,把主域名(meow.page)从 Plesk 接入到 Cloudflare,因为 plesk 接入可以获得 Cloudflare 伪 Pro 套餐,伪 Pro 套餐内包含:

  • WAF (一直没玩过,有用)
  • 30 条 Page Rules (可以用来做页面缓存规则,有用)
  • Spectrum (刚给付费套餐开放的功能,可以为 SSH 和 Minecraft 提供代理,有用)
  • Custom Error Page (定制错误页,这个也很想要,有用)
  • Polish(在 Speed 标签页下,为图片优化,一般)
  • Mirage(在 Speed 标签页下,较差网络链接时,为移动设备优化页面加载)

不过之所以说是伪 Pro,是因为它和真 Pro 还是有点差距。比如说,真 Pro 有 20 条 Firewall Rules,伪 Pro 和 Free 一样是 5 条
但是,从 Plesk 接入,意味着要把域名从 Cloudflare 删除,然后再去 Plesk 加入域名。

接入 Plesk

这里顺带简单提一下从 Plesk 接入吧,即使这并非本文的的主题。

  1. 删除前备份域名的相关设置,DNS 记录;Origin 证书不用下载下来备份
  2. 在 Cloudflare 面板,Overview 标签页最下面,点击 Remove Site from Cloudflare
  3. 在 Plesk 面板添加你的域名,添加后点击右边的 ServerShield by Cloudflare 插件,激活 Cloudflare
  4. 回到 Cloudflare 面板,你会发现域名回来了,显示的套餐是 Plesk Plus with WAF
  5. 完成,WAF 功能也有了

更改文章链接

本站之前,根据 git log 来看,准确说是,2020年5月23日11:54分之前

1
2
3
Date:   Sat May 23 11:54:48 2020 +0800

Update permalink

文章链接的格式是

1
permalink: :year/:month/:day/:title/

渲染出来的链接是这样的:

1
https://blog.meow.page/2018/11/12/build-rdm-for-mac-from-source/

我将其更改为

1
permalink: archives/:title/

更改的原因:

  1. 不方便设置 Page Rules(这是主要原因)
  2. 文章日期更改,URL 也变了。虽然很少会改动发表日期,但总有例外的情况,比如想通过更改发表日期来置顶某些文章。

至于为什么要设置 Page Rules?

Cloudflare only caches based on file extension and doesn’t cache by MIME type. The Cloudflare CDN automatically caches files containing certain file extensions and doesn’t cache HTML by default. 来源

  1. Cloudflare 只基于文件后缀名(拓展名)来进行缓存
  2. 默认不对 HTML 进行缓存
  3. 只能通过设置 Page Rules,来让 Cloudflare 缓存 HTML
1
https://blog.meow.page/2018/11/12/build-rdm-for-mac-from-source/

这样的链接,显然不包含拓展名,而且是 HTML,只能设置 Page Rules,但是日期是无法固定的,改成 /archives/ 就固定了。

提交站点地图

文章链接更改后,我将更改 push 到仓库,gitlab ci 会完成 hexo 的构建,生成静态 HTML 文件,并部署到 gitlab page 服务。

站点地图,https://blog.meow.page/sitemap.xml , 需要提交给搜索引擎,搜索引擎会爬取并检查链接的有效性,编入索引,也就是在搜索结果中呈现新的链接

设置 Page Rules

If the URL matches : https://blog.meow.page/archives/*/
Cache Level: Cache Everything

测试,第一次会 MISS ,第二次会 HIT

1
2
3
4
5
6
7
[$] <> curl https://blog.meow.page/archives/install-oracle-database-on-centos-linux-waltkhrough/ -I | grep 'cf-cache-status'

cf-cache-status: MISS

[$] <> curl https://blog.meow.page/archives/install-oracle-database-on-centos-linux-waltkhrough/ -I | grep 'cf-cache-status'

cf-cache-status: HIT

关于cf-cache-status表头的含义,你可以查看 Cloudflare 的帮助文档,不过我建议你看英文的那个版本,因为中文版缺少了 DYNAMIC 的标头

disqus 评论迁移

开始以为以前的评论就这样丢失了,突然发现 Disqus 提供了 URL Mapper 功能,可以通过提交老链接到新链接的 mapper 文件来迁移文章评论(讨论区)。

功能位置:Tools - Migration Tools - Upload a URL map

影响

这样就完了吧。。。

过了两天,在谷歌里面搜了下之前点击量比较高的文章,发现链接还是老的。

统计工具里面,博客入口页面竟然是 谷歌快照 !(因为原来的链接挂掉了,用户就访问快照了。。

关键的问题是,有一部分文章被外链引用,这部分链接是没法更新的。搜索过程中,还发现有条外链还是贴的上个域名。

解决

虽然也想到用 Page Rules 来设置跳转,但是 URL 中的日期,要怎么匹配呢?这种应该用正则来匹配,但是 Page Rules 压根儿不支持正则呀。

如果有什么编程语言能够解决就好了。

啊,那不就是 Cloudflare Worker 吗?

设置一个正则,匹配上了就 301 跳转到新的地址。

垃圾代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
async function handleRequest(request) {
let url = new URL(request.url)
let site = 'https://blog.meow.page/archives/'
let old_archive_reg = new RegExp(...)
if (old_archive_reg.test(url.pathname)) {
let article_title = url.pathname.match(old_archive_reg)[1]
return Response.redirect(site + article_title,301);
}
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

将这个 Worker 绑定到 https://blog.meow.page/* 下。

完了吗?

没有。

仔细看你会发现这个 Worker 有点问题,匹配上规则的那部分 URL 跳转到了新的正确的 URL,但再次刷新就 500 了。

因为没有匹配上规则的那部分 URL 没有被 handle,这部分请求进入了 Worker,但是 Worker 没有任何回复。

所以,再次修改为如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
async function handleRequest(request) {
let url = new URL(request.url)
let site = 'https://blog.meow.page/archives/'
let old_archive_reg = new RegExp(...)
if (old_archive_reg.test(url.pathname)) {
let article_title = url.pathname.match(old_archive_reg)[1]
return Response.redirect(site + article_title,301);
}
return fetch(request)

}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

这样就算好了

CURL 验证一下(去掉不必要的标头),可以看到已经正确实现 301 跳转了

1
2
3
4
5
6
curl https://blog.meow.page/2018/11/12/build-rdm-for-mac-from-source/ -I
HTTP/1.1 200 Connection established

HTTP/2 301
location: https://blog.meow.page/archives/build-rdm-for-mac-from-source/
server: cloudflare

总结

没事不要乱改 permalink,一开始就要设置好,本来permalink意思就是永久链接,改了会惹出一堆事。

我实在想不通默认的这种格式到底有什么好处。

其实,还有一个无法挽救的影响。

链接更改了后,disqus 评论也全部丢失了,评论永远埋在了过去的链接之下,而那些链接再也无法访问到,哭qwq。