前言及背景
在Cloudflare CDN到国内访问速度不理想的情况下,CDN可以通过SaaS实现CNAME接入以自定义节点IP,Pages本就支持CNAME接入,但Workers和R2存储桶却不支持,不过由于Workers可以通过Pages Function使用,故本文讨论关于R2的自选IP加速方法
方案概述
有以下几种方案备选
使用Pages调用R2自建Restful API并使用CNAME接入的域名调用
直接使用Pages反代R2存储桶的自定义域名
使用Pages反代R2的
xxx.r2.dev公共域名
经过实际操作后,1会因为出现R2跨域鉴权的问题,xxx.pages.dev 域名可用,但使用CNAME接入的域名会404的情况,2也会出现与1相同的情况,均不可用,所以本文使用3方法
实际操作
准备事项
一个Cloudflare R2存储桶
一个华为云账户(仅使用DNS功能,国际版无需实名使用邮箱注册即可)
一些到国内速度较好的Cloudflare Anycast IP
一个Github账户
操作
1.开启R2存储桶的公共访问(xxx.r2.dev 域名)
2.在绑定了Cloudflare账户的Github账户中新建一个仓库,新建_worker.js 文件,写入如下代码
export default {
async fetch(request, env) {
let url = new URL(request.url);
if (url.pathname.startsWith('/')) {
url.hostname = 'example.r2.dev'//替换为你的存储桶给出的域名
let new_request = new Request(url, request);
return fetch(new_request);
}
return env.ASSETS.fetch(request);
},
};3.在Cloudflare中部署Pages并添加自定义域名
4.将要解析的自定义域名NS记录到华为云并设置优选,国内使用优选IP,国外CNAME到Cloudflare给出的xxx.pages.dev域名
效果

50MB世界地图
不足与改进思路
1.xxx.r2.dev 域名始终可以访问,此域名无优化且无法使用R2和Cloudflare的其他访问控制功能,理论上可通过前文中1与2方案解决,但需解决R2跨域鉴权的问题
2.Pages Function内存限制125MB,导致大于125MB的文件无法传输,据Cloudflare官方文档,可使用流式传输解决