利用 Cloudflare 重定向规则实现 CDN 资源的海内外分流

本站使用 jsDelivr CDN 引入第三方 JS 库,由于 jsDelivr 目前只有位于中国大陆境外的节点,从大陆境内访问的速度一直不太稳定,通过 ChinaZ 站长工具 测试发现部分地区或宽带线路甚至无法访问……虽然人在境外,但博客以中文受众为主,感觉这个问题还是得解决一下,于是研究了一下 Cloudflare 重定向规则,实现了 CDN 资源的海内外分流。

在确保境外访客获取 JS 库资源速度的同时,提升中国大陆境内访客获取资源的速度。

对于源自中国大陆境内的访问,将 JS 库资源重定向至大陆境内访问速度快的 CDN 站,对于中国大陆境外的访问则直接回源至 jsDelivr 等全球 CDN 站。

2023-07-29:为了更方便地加速一些仅位于 GitHub 的 JS 库,已从 cdnjs 改用 jsDelivr。境内采用 jsd.cdn.zzko.cn 加速,境外回源 jsDelivr CDN。

经过一番搜寻,发现有以下几个在中国境内访问速度似乎不错的 CDN(镜像)资源站:

cdn.bytedance.com:字节跳动静态资源公共库

cdn.baomitu.com:360 前端静态资源库(75CDN),无海外优化

cdn1.tianli0.top:个人运营的免费JSD镜像(详见此文:免费JSD镜像使用手册

jsd.cdn.zzko.cn:由「ayao」提供的 jsDelivr 公益加速源,腾讯云CDN,有缓存1GitHub Repo

raw.iqiq.io:由「iQDNS/iQZone」提供的 GitHub (?) 公益加速源,无缓存(或时间很短)1

mirrors.sustech.edu.cn/cdnjs/:南方科技大学 cdnjs 镜像站,有境内外分流,境内分流似乎分流到南科大的服务器(位于深圳),境外302重定向到 cdnjs 源站

use.sevencdn.com:7ED CDNJS 加速服务,有境内外分流,境内分流到某境内 CDN 的各地区节点,境外似乎分流到 Cloudflare 网络(Vercel)(详见此页:公共 CDN 静态资源加速服务

cdnjs.loli.net:同步 cdnjs 库, xTom 日本节点,有境内外分流,境外似乎分流到 Cloudflare 网络 (详见此文:前端 CDNJS 库及 Google Fonts、Ajax 和 Gravatar 国内加速服务

研究测试后发现字节和360的 CDN 虽然不错,但是在 Cloudflare 的重定向规则上不好处理。jsDelivr 加速镜像虽然可用,但是不知稳定性如何。最后三个是 cdnjs 的加速镜像,测试下来感觉还是比较好用的,所以改用了 cdnjs 作为本站的 JS CDN。南科大镜像站看起来最为靠谱,但它只有一个位于深圳的节点,而 7ED 则有大陆境内各地区的节点分流,访问速度或许会快上那么一些。至于最后一个镜像站,应该也比较靠谱,毕竟似乎 loli.net 比较有名所以口碑应该不错(?),xTom 日本节点访问速度也不错。最后综合考虑暂且选择了 7ED,但愿它的境内 CDN 分流能在一定程度上优化访问速度。

不得不说 Cloudflare 是真心好用,把域名放上去以后,可以设置各种规则,比如 SSL/TLS、Workers、缓存、页面规则等等。为了实现中国境内外的 CDN 分流,新建一个二级域名 cdnjs.upup.dev 作为网站的 CDN 资源访问入口,当 Cloudflare 检测到源自中国大陆境内的请求时重定向至 CDN 镜像站 use.sevencdn.com,否则重定向至 cdnjs 源站 cdnjs.cloudflare.com。

在 Cloudflare 管理面板设置重定向规则(Rules - Redirect Rules),添加两个单一重定向规则(Single Redirects):

1. 源自中国大陆境内的请求: cdnjs.upup.dev -> use.sevencdn.com

重定向规则 – 源自中国大陆境内的请求

2. 源自中国大陆境外的请求: cdnjs.upup.dev -> cdnjs.cloudflare.com

重定向规则 – 源自中国大陆境外的请求

注 1:重定向规则条件里基于 geoip 的「Country」一项中的「China」应该特指中国大陆,因为港澳台有单独列出。
注 2:HTTP 重定向状态选择302而不是301。虽然两类请求都会被 Cloudflare 缓存2,但301理论上是永久跳转而302是临时跳转,因此301可能会导致长时间缓存,不利于今后修改重定向到新地址。