使用cloudflare page的worker反向代理backblaze
最近为了节省在vps/域名/储存等各种方面的支出,开始想尽一切办法做一个蝗虫,大多数文件都搬进网盘了,有些东西因为各种限制(比如直链/不限线程/不限速)只能用对象储存解决,看到b2价格还可以,而且套娃cloudflare不计流量费,但cloudflare的tos不允许这样操作,只能创建个小号玩一下,又不想新买个域名,于是便打起了cloudflare page的主意.
场景限制
- 不用自己的cloudflare主号(因为这个操作可能会被ban)
- 不购买域名,使用其它的免费二级域名(eu.org/cloudns/sitelutions)
- 不将域名的ns指向Cloudflare(主要是除了eu.org其它二级域名不支持)
这样一来cloudflare worker就不满足要求了,因为cloudflare worker要想绑定域名只能将域名添加到cloudflare,以前可以通过合作伙伴的api添加cname解析,现在合作伙伴已经拉闸了,如此一来要么saas,要么cloudflare page,saas也要一个域名通过ns接入,那就只剩下cloudflare page了
cloudflare page的worker功能
根据cloudflare的介绍,cloudflare page支持使用worker,主要途径有2种,一种是将js放到functions
目录,一种是在根目录创建_worker.js
,而functions目录内的代码需要进行编译,只能通过git或者wrangler操作时才能触发编译,而_worker.js
不受限制,因此为了方便选择了_worker.js
_worker.js
主要参考了这篇使用cloudflare worker和b2制作免费图床
不过,与其说是参考,不如说就是复制一下,做了一些小修改,删了点东西,改后代码如下.
'use strict';
const b2FileDomain = "fxxx.backblazeb2.com"; // 替换成你的储存桶的美化域名
const b2Bucket = 'bucket'; // 替换成你的储存桶名称
const b2UrlPath = `/file/${b2Bucket}`;
export default {
async fetch(request, env) {
return fileReq(request);
},
}
// backblaze returns some additional headers that are useful for debugging, but unnecessary in production. We can remove these to save some size
const removeHeaders = [
'x-bz-content-sha1',
'x-bz-file-id',
'x-bz-file-name',
'x-bz-info-src_last_modified_millis',
'X-Bz-Upload-Timestamp',
'Expires'
];
const expiration = 31536000; // override browser cache for images - 1 year
// define a function we can re-use to fix headers
const fixHeaders = function (url, status, headers) {
let newHdrs = new Headers(headers);
// override browser cache for files when 200
if (status === 200) {
newHdrs.set('Cache-Control', "public, max-age=" + expiration);
} else {
// only cache other things for 5 minutes
newHdrs.set('Cache-Control', 'public, max-age=300');
}
// set ETag for efficient caching where possible
const ETag = newHdrs.get('x-bz-content-sha1') || newHdrs.get('x-bz-info-src_last_modified_millis') || newHdrs.get('x-bz-file-id');
if (ETag) {
newHdrs.set('ETag', ETag);
}
// remove unnecessary headers
removeHeaders.forEach(header => {
newHdrs.delete(header);
});
return newHdrs;
};
async function fileReq(request) {
const cache = caches.default; // Cloudflare edge caching
const url = new URL(request.url);
url.protocol = "https:";
url.port = 443;
url.hostname = b2FileDomain;
url.pathname = b2UrlPath + url.pathname;
let response = await cache.match(url); // try to find match for this request in the edge cache
if (response) {
// use cache found on Cloudflare edge. Set X-Worker-Cache header for helpful debug
let newHdrs = fixHeaders(url, response.status, response.headers);
newHdrs.set('X-Worker-Cache', "true");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHdrs
});
}
response = await fetch(url);
let newHdrs = fixHeaders(url, response.status, response.headers);
response = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHdrs
});
cache.put(url, response.clone());
return response;
}
其中域名和储存桶名称的获取方式不做介绍,请看原文或者直接搜索b2+cloudflare worker的教程,里面应该都有提到.
cloudflare page如何设置自定义域名也不做介绍,自己搜索一下或者在页面里翻一下就能找到.
将修改后的代码保存为_worker.js
,然后部署到你的cloudflare page项目中即可.
其它说明
如果有域名可以将ns托管到cloudflare的情况下建议还是使用cloudflare worker
此外cloudflare也提供免费10g的对象储存,如果不介意添加支付方式的话,可以绑定一下信用卡或者paypal之后开通,paypal可以在绑定后再到paypal里取消结算协议,但取消后是否限制功能未知.
需要注意,cloudflare提供的对象储存如果要想改为公共储存只能使用ns托管在cloudflare的域名.
如果需要在本地使用wrangler进行调试的话,切记指定请求协议和端口.
以上~