使用cloudflare worker实现代理下载

⌚Time: 2025-10-31 16:02:00

👨‍💻Author: Jack Ge

需求

我需要下载一个网站的内容,100gb的很多数量的文件。但是不是中国的网站。在中国的封闭网络下速度只有10kb/s的速度。

最重要的是,这个网站是http协议,不是https协议。这让文件正确性降低。虽然底层tcp协议能够确保传输正确,但是下载大量文件在这种网络下不会太可靠。

如果网站是https协议,就算10kb/s,频繁丢包,也能下个几天,只要下载完成了就行了,反正https是极端可靠的不会出错。他会在tcp之上再次进行强大的验证数据正确性,但是http协议,只有tcp底层的16位效验码保证不太可信。

我使用wget进行下载挂着慢慢下载。虽然链接稳定,没有中断过,一直在匀速下载,但是在下载了14gb数据之后我放弃挣扎。网络质量太差。

我决定使用vpn。我用hide.me vpn下载,一开始速度极快,600kb/s,后来vpn检测到我的程序在一直下载,就断开了我的网络,弹出提醒。

最后我想到cloudflare。使用cloudflare worker实现代理下载。利用cloudflare节点能够访问国外网络的特点。

部署过程

cf主页面有一个worker pages

直接创建helloworld

出现编辑区

直接输入代码,点击deploy,我用ai生成的代码进行简单的代理。

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

async function handleRequest(request) {
  const url = new URL(request.url);
  
  // 直接代理到 abc.com
  const targetUrl = 'https://abc.com' + url.pathname + url.search + url.hash;
  
  const response = await fetch(targetUrl);
  const modifiedResponse = new Response(response.body, response);
  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
  return modifiedResponse;
}

其中abc.com就是我要代理的网站

之后cf的创建的worker页面会有类似下面的worker地址,点击访问就行了,但是大概率不能直接访问。

workers.dev

dark-wildflower-xxxxx.xxxxxx.workers.dev

需要把worker绑定自己的域名,这样就可以直接通过自己的域名访问worker

在worker的setting里面,domains routes,点击add

直接选custom domain

在之后的对话框输入自己的域名就行了。前提是域名是自己的域名,通过cloudflare解析的,之前已经添加到cf里的。

比如可以设置一个二级域名

worker.yoursite.top

之后直接通过worker.yoursite.top访问就能够访问到abc.com这个网站。

测试

效果非常好。同一个文件下载

这是直接连接的速度,基本上30kb/s,之后会一直稳定在10kb/s,需要超过1h的时间下载。

52796                           0%[                                                    ]   1.02M  36.1KB/s   eta 49m 58s52796                           0%[                                                    ]   1.02M  34.6KB/s   eta 49m 58s52796                           0%[                                                    ]   1.03M  34.5KB/s   eta 49m 58s52796                           0%[                                                    ]   1.05M  36.6KB/s   eta 49m 58s52796                           0%[                                                    ]   1.06M  37.0KB/s   eta 50m 34s52796                           0%[                                                    ]   1.07M  37.6KB/s   eta 50m 34s52796                           0%[                                                    ]   1.07M  36.5KB/s   eta 50m 34s52796                           0%[                                                    ]   1.08M  37.4KB/s   eta 50m 34s52796                           0%[                                                    ]   1.09M  36.4KB/s   eta 51m 34s52796                           0%[                                                    ]   1.10M  35.0KB/s   eta 51m 34s52796                           0%[                                                    ]   1.11M  34.9KB/s   eta 51m 34s

这是用了cf代理的,平均速度1.14mb/s,在2m30s下完了。

52796                       100%[===================================================>] 155.30M  1.14MB/s   in 2m 30s

总结

我发现其实不用cf也没有问题。直接连接网站速度虽然很慢,但是比较稳定一直是10kb/s,这代表只是速度限制,不是网络恶劣,频繁错误和丢包。因为它从未中断过连接,一直稳定下载。

如果是网络恶劣频繁数据出错和丢包重发,它的速度不可能稳定,会有剧烈变化,会频繁变成0kb。并且wget会频繁的出错和重试。现实就是之前下载了14gb的内容之后没有见过wget重试过。

所以我直连几乎也不会出错。只是要很多天连续下载。

后来我使用cf代理下载了2gb数据10000个文件,与之前直连下载的同样数量的文件进行验证,使用了自己开发的文件夹对比软件

发现只有几百个html文件不一致,这是正常的,因为同一个页面不同时间获取可能内容不一样。真正的资源文件完全一样,这说明之前的低速网络下能够正常传输。

扩展

现在国内的github加速代理可能就是这个原理。通过cf代理节点实现github加速访问。只需要改改worker代码就行了。

就是把一个代理网站加载github的前面。通过worker代理访问。一样的。

https://proxy.com/https://github.com/file