Node.js 是否可以将Cloudflare Service Worker用作代理web服务器?

Node.js 是否可以将Cloudflare Service Worker用作代理web服务器?,node.js,service-worker,serverless,nodejs-stream,cloudflare-workers,Node.js,Service Worker,Serverless,Nodejs Stream,Cloudflare Workers,这只是一个初级问题,希望获得一些建议,由于缺乏知识,下面的问题可能会误用一些关键术语,但希望能够向大家传达关键信息: 背景: 我的公司在AWS上托管一个网站,一切正常,除了它无法在中国加载外,因为众所周知的中国长城防火墙将阻止中国境外所有未注册/未授权的网站;最好的解决方案也许是在中国托管一台服务器,并获得中国政府批准的ICP许可证,但这需要时间和许多其他考虑因素。因此,我们现在正在寻找一些替代方案,让我们的中国客户能够阅读我们网站上的内容 主旨: 首先使用Cloudflare服务人员从给定网页

这只是一个初级问题,希望获得一些建议,由于缺乏知识,下面的问题可能会误用一些关键术语,但希望能够向大家传达关键信息:

背景:
我的公司在AWS上托管一个网站,一切正常,除了它无法在中国加载外,因为众所周知的中国长城防火墙将阻止中国境外所有未注册/未授权的网站;最好的解决方案也许是在中国托管一台服务器,并获得中国政府批准的ICP许可证,但这需要时间和许多其他考虑因素。因此,我们现在正在寻找一些替代方案,让我们的中国客户能够阅读我们网站上的内容

主旨:
首先使用Cloudflare服务人员从给定网页获取HTTP资源,然后由服务人员将HTTP内容发送给用户(因为Cloudflare在中国是可访问的)

示例:
让Cloudflare的注册服务工作者URL为:sample.workers.dev
要提供的目标网站内容:google.com
当用户尝试访问此域(sample.workers.dev)时,服务人员应尝试从后端的google.com加载所有HTTP内容,包括图像、脚本和css,然后直接将HTTP内容返回给用户

这将适用于我公司的客户,因为我们通常会生成一个url,并通过电子邮件或其他方式发送给用户,因此我们可以向他们发送一个在中国可以访问的第三方url,同时实际从我们的原始网站加载内容

我已经尝试了Cloudflare提供的所有示例: 但到目前为止,我还没有把我想要的东西存档


有什么想法吗?

是的,有可能。我记得Cloudflare的某个人将其作为一个示例来实现

找到它:

然而,Cloudflare workers现在确实支持流式API IIRC,因此有更好的方法来实现这一点

/**
 * HTTP Proxy to arbitrary URL with Cloudflare Worker.
 */

/**
 * Cloudflare Worker entrypoint
 */
if (typeof addEventListener === 'function') {
    addEventListener('fetch', (e: Event): void => {
        // work around as strict typescript check doesn't allow e to be of type FetchEvent
        const fe = e as FetchEvent
        fe.respondWith(proxyRequest(fe.request))
    });
}

async function proxyRequest(r: Request): Promise<Response> {
    const url = new URL(r.url)
    const prefix = '/worker/proxy/'
    if (url.pathname.startsWith(prefix)) {
        const remainingUrl = url.pathname.replace(new RegExp('^' + prefix), '')
        let targetUrl = decodeURIComponent(remainingUrl)
        if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {
            targetUrl = url.protocol + '//' + targetUrl
        }
        return fetch(targetUrl)
    } else {
        return new Response('Bad Request', {status: 400, statusText: 'Bad Request'})
    }
}

interface FetchEvent extends Event {
    request: Request;

    respondWith(r: Promise<Response> | Response): Promise<Response>;
}
/**
*使用Cloudflare Worker将HTTP代理发送到任意URL。
*/
/**
*Cloudflare Worker入口点
*/
if(addEventListener的类型=='function'){
addEventListener('fetch',(e:Event):void=>{
//由于严格的typescript检查不允许e为FetchEvent类型,因此需要解决此问题
常量fe=e作为FetchEvent
fe.响应(代理请求(fe.请求))
});
}
异步函数proxyRequest(r:Request):承诺{
const url=新url(r.url)
常量前缀='/worker/proxy/'
if(url.pathname.startsWith(前缀)){
const remaingurl=url.pathname.replace(新的RegExp('^'+前缀),'')
让targetUrl=decodeURIComponent(remainingUrl)
如果(!targetUrl.startsWith('http://')和&!targetUrl.startsWith('https://')){
targetUrl=url.protocol+'/'+targetUrl
}
返回获取(targetUrl)
}否则{
返回新响应('错误请求',{status:400,statusText:'错误请求'})
}
}
接口FetchEvent扩展事件{
请求:请求;
回应(r:承诺|回应):承诺;
}