Cloudflare Workers 初体验

之前一直都关注 Cloudflare Workers 推出的 serverless 服务。但是一直没有动手去尝试一下。今天访问 Github 一直无法连上。突然想到了 Cloudflare 的 这个服务,看能不能解决当前的痛点。果然需求是学习的最大动力

首先登录到 Cloudflare 的 dashboard https://dash.cloudflare.com/找到右侧的 Workers 服务。然后创建一个新的 Worker 应用。然后就是发挥你的才智创造啦!

通过阅读官方文档应该很快就能掌握 Workers 的使用。只要 js 过关的话应该很快就能掌握。我直接翻到 Runtime APIs 部分。大致了解了下官方提供的相关 API。可以说官方的文档还是挺不错的,基本上都有相应的 Demo 可以参照。

那么解决不能访问 Github 的问题的大致思路就是:

  1. 添加一个事件监听本地客户端发送的请求

  2. 封装一个对请求的处理,先去 fetch Github 源站点获取内容然后返回给本地客户端结果

添加一个事件监听的核心代码:

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

请求处理的核心代码:

const domain_list = ['https://your-workers-name.geehon.workers.dev']
const upstream = 'https://www.github.com/'

async function reqHandler(request) {
    let url = request.url;
    const method = request.method;
    const headers = request.headers;

    for(let domain of domain_list) {
        url = url.replace(domain, upstream)
    };
    
    const response = fetch(url, {
        method: method,
        headers: headers
    })

    return response;
}

完整代码

// List of domains bind to your WorkersProxy.
const domain_list =  ['https://your-workers-name.geehon.workers.dev']

// Website you intended to retrieve for users.
const upstream = 'https://www.github.com/'

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

async function reqHandler(request) {
    const method = request.method;
    const headers = request.headers;
    let url = request.url;

    for(let domain of domain_list) {
        url = url.replace(domain, upstream)
    };

    const response = fetch(url, {
        method: method,
        headers: headers
    })
        
    return response;
}

想要添加 IP 过滤,客户端识别或者其他的请求处理直接添加到 reqHandler 函数里即可。

声明:本文只介绍一种解决问题的思路,切勿用于非法用途。请勿滥用厂商的资源!