免费的科学上网工具
赞扬一波 Cloudflare
Cloudflare 是我用过的最良心的 CDN 厂商了,功能多还免费。最近似乎各大厂商都在搞边缘计算,CF 也不例外,这不搞了个 worker 的概念,还给每个用户提供每天免费的 10 万请求量。
太长不看版本
直接访问 https://jsproxy.endpot.workers.dev,测试所谓新概念的在线代理 & CF Worker。
注意:该站点仅用于测试,请勿用于非法用途,否则后果自负!
Worker 是什么鬼?
光看了前面的赞扬,可能你还觉得云里雾里的。简单的说,CF 提供的 worker 就是可以运行用户自定义代码的计算容器。按照 官方文档 可以很方便地把一个纯计算型的站点重写并迁移到 CF 上,从此再也不需要自掏腰包付服务器的费用。
JSProxy
介绍 JSProxy 之前,得先介绍下在线代理相关内容。由于实在是太懒了,我就从 JSProxy 项目中照搬作者原话吧。
什么是在线代理
所谓在线代理,即可通过某个网站访问另一个网站(通常无法直接访问)。不用安装任何插件,不用修改任何配置,仅仅打开一个网页即可。
类似的网站,或许大家都曾见过,并且印象中应该都不怎么好用。相比 ss/v2 这些网络层代理,在线代理的成熟度显然要低得多,只能临时凑合着用。
为什么在线代理不好用
因为要实现一个完善的在线代理,难度非常大!也许你会说,用 nginx 搭个反向代理不就可以了。其实并没有这么简单。举个例子,假如我们用 a.com
反向代理 b.com
,并且 b.com
有如下网页:
1 | <img src="/foo.gif"> |
第一个 img 是相对路径。由于当前实际地址是 a.com
,因此最终访问的 URL 是 http://a.com/foo.gif
。我们的后端服务器收到请求后,抓取 http://b.com/foo.gif
的内容并返回给用户。这没有问题。
第二个 img 是绝对路径,这就有问题了!浏览器会直接访问 b.com
,根本不经过我们的后端。而 b.com
是无法直接访问的,于是图片加载失败。
因此后端在代理网页时,还需要对其中的内容进行处理,将那些 绝对路径 URL 替换成自己的地址。例如:
1 | <img src="/foo.gif"> |
这样才能确保图 2 走我们的站点,而不是连接 b.com
导致逃脱代理。
由此可见,衡量一个在线代理完不完善,很重要的一点就是:能否覆盖网页中尽可能多的 URL,减少逃逸现象。
虽然替换网页中的 URL 并不困难,但是,这极其麻烦!
做过 Web 开发的都清楚,网页里的 URL 有千奇百怪的存在形式,可存在于 HTML、CSS、JS 甚至是动态加载的 JSON、XML 等资源中,因此后端只处理 HTML 是不够的,还必须处理各种文本资源!这对服务器是个不小的开销。
除了内容处理,其实还有很多额外开销。互联网上的文本资源大多都是压缩传输,而压缩的数据是无法直接处理的,因此还得先解压;最后处理完的数据,还得再压缩回去。一来一往,消耗不少 CPU。当然也可以不压缩,但这又会增加流量开销。
像过去的 gzip
压缩开销尚可接受,而如今流行的 brotli
压缩开销非常大。假如用户频繁访问大体积的文本资源,代理服务器 CPU 将严重消耗。
不过,上述问题还不是最严重的。事实上 HTML、CSS 等资源都好说,唯独 JS 是个坑 —— 因为 JS 是程序,它可以动态产生 URL。例如:
1 | var site = 'b'; |
遇到这种场合,任何字符串层面的替换都是无解的!
除了动态产生 URL,还有动态获取 URL 的情况。因为有很多 API 是和 URL 相关的,例如:
document.domain
,document.URL
,document.cookie
- 超链接
href
属性,表单action
属性,各种元素src
属性 - 消息事件
origin
属性 - 省略数十个 …
在我们 a.com
页面里调用这些 API,返回自然是 a.com
的 URL,而不会是 b.com
。假如网页里的业务逻辑仍以 b.com
作为标准处理,很可能就会出现问题。
这类情况现实中很普遍,而传统的在线代理,对此则无能为力。
新概念在线代理
讲了那么多在线代理的坑,终于到 JSProxy 上场了。至于作者是如何一步步填坑的,可以看 基于 JS Hook 技术,打造最先进的在线代理,我就不抄过来了。
免费代理
得益于 JSProxy 作者的良心之作,以及 CF 的免费政策,我把 JSProxy 跑在了 CF 的 worker 上,每天有 10 万的免费请求数。
抛个网址 https://jsproxy.endpot.workers.dev 出来,欢迎大家测试,请勿用于违法用途,否则后果自负。