一个任意网页反代的 Serverless 实现

2019-06-04 06:04:45 +08:00
 Contextualist

Demo: (以 Google 为例,请用无痕浏览 /隐身模式打开,以免 Cookie 污染)

https://proxlet.now.sh/https://google.com

请温柔使用,我账户的免费额度是每天 5000 次请求

原理其实没什么技术含量:访问一个网站主请求的响应会被加上一个额外的 Cookie,值为其 URL 本身(类似于 Referer ),这样其域内的后续子请求因为带上了这个 Cookie 而能被服务端导向正确地址(一个显然的缺陷是,跨域请求都不能被反代,见下“已知的限制”)。重定向在服务端会被拦截处理。除此之外,对于响应不会有任何修改。

这样,每个请求都相互独立,于是就可以上 Serverless 了。我自己的实验中,Zeit Now (即 demo )是成功的。AWS Lambda 和 GCF 默认的 HTTP 网关都带路径的,后续请求不能用,绑定自定义域名我就没试了。

我的实现很 naïve,基于 Go 自带的 httputil.ReverseProxy,核心功能不过百行代码,请大佬们轻喷。这个项目的目标是展现只需要一个很小的切入点就可以实现简单无状态的任意网页反代,距离一个完善可用的实现还有很远的距离。

贴上代码: https://github.com/Contextualist/proxlet

或许我这个想法(即利用 Cookie 做反代)已经有更好的实现了,如果各位有见过,请不吝赐教。

已知的限制:

  1. 跨域请求都不能被反代,除非篡改响应正文里的链接,但是这就把问题引向了另一个复杂的方向。我相信在链接替换方面应该已经有成熟的方案了,我就不造轮了。
  2. Serverless 的提供商对请求和响应的大小会有限制:对于 Now 和 AWS Lambda 是 6MB,对于 GCF 是 10MB。
4182 次点击
所在节点    分享创造
4 条回复
lzxgh621
2019-06-04 07:24:23 +08:00
跟 jsproxy 挺像 没它好用 你这个内部链接还是原站的
Contextualist
2019-06-04 07:37:56 +08:00
@lzxgh621 拿 jsproxy 跟我这个小作品比,见笑了。两者的实现原理还是差别有点大,jsproxy 靠的是浏览器端 service worker 拦截所有请求,我这个是佛系反代,不做篡改,相对链接自然上钩,绝对链接 /跨域请求就不强求了(见限制 1 )。
abmin521
2019-06-04 13:05:26 +08:00
关注一下
sindri
2019-06-04 14:09:22 +08:00
好久没见着 GOOGLELOGO 长啥样了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/570585

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX