MENU

使用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进行调试的话,切记指定请求协议和端口.

以上~

添加新评论