V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Contextualist
V2EX  ›  分享创造

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

  •  
  •   Contextualist ·
    Contextualist · 2019-06-04 06:04:45 +08:00 · 4197 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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。
    4 条回复    2019-06-04 14:09:22 +08:00
    lzxgh621
        1
    lzxgh621  
       2019-06-04 07:24:23 +08:00 via Android
    跟 jsproxy 挺像 没它好用 你这个内部链接还是原站的
    Contextualist
        2
    Contextualist  
    OP
       2019-06-04 07:37:56 +08:00
    @lzxgh621 拿 jsproxy 跟我这个小作品比,见笑了。两者的实现原理还是差别有点大,jsproxy 靠的是浏览器端 service worker 拦截所有请求,我这个是佛系反代,不做篡改,相对链接自然上钩,绝对链接 /跨域请求就不强求了(见限制 1 )。
    abmin521
        3
    abmin521  
       2019-06-04 13:05:26 +08:00 via Android
    关注一下
    sindri
        4
    sindri  
       2019-06-04 14:09:22 +08:00
    好久没见着 GOOGLELOGO 长啥样了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3213 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:03 · PVG 13:03 · LAX 21:03 · JFK 00:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.