首先抛出问题:如何通过自己的域名,访问其他网站?或者想象一个更具体的例子,笔者该如何实现通过 mysite.com 这个域名,在浏览器中访问微软官网?你的第一个想法大概率会是在 DNS 中添加一条 CNAME 记录,将 mysite.com 解析到 microsoft.com。然而问题却并没有表面这样简单。
DNS 的局限
DNS 的作用是域名到 IP 地址的翻译。它告诉浏览器某个域名(或子域名)对应的服务器在哪里。由于 DNS 工作在域名层,你可以:
将
mysite.com指向一个 IP 地址 (A 记录)。将子域名
mysite.com指向另一个服务,比如 Microsoft 的服务器 (CNAME 记录)。
相应的,不能将 mysite.com/zh-cn 这个路径指向任何地方。DNS 根本不理解 URL 中域名后面的路径部分,因此无法实现路径级别的统一:这是最关键的一点。如果希望实现 mysite.com/surface 指向 microsoft.com/surface,mysite.com/windows 指向 mysite.com/windows,DNS 完全无能为力。同时 URL 地址栏会变化:使用子域名方式后,用户访问时,地址栏显示的是 microsoft.com/windows,而不是 mysite.com/windows。
引入反向代理
反向代理最为熟知的应用是隔离防护,由于客户端直接访问的是反向代理服务器的IP地址,后端真实服务器的IP地址和网络拓扑结构对外界是不可见的。这大大增加了攻击者直接攻击后端服务器的难度。
然而反代恰好工作在应用层,它可以读取和理解完整的 URL,包括路径(/windows)、请求头等所有信息,是一个真正的服务器程序。所以可以接收所有发往 mysite.com 的请求,然后,检查请求的具体 URL,再决定把这个请求转发给哪个后台服务。
我们可以依靠这一点,真正实现路径级别的统一:这是反向代理的核心优势。它可以检查到用户访问的是 mysite.com/windows,然后默默地去请求 microsoft.com/windows 的内容,再把内容拿回来,呈现给用户。整个过程对用户透明,因此无论后台内容来自哪个服务,浏览器地址栏始终是 mysite.com 开头的地址。
Cloudflare Workers
我并不希望分配出自己的 VPS 专门为反代的目的配置 nginx,而 CF Workers 这样的无服务器计算产品再适合不过了。事实上,“无服务器”这个名字其实有点误导,它不是指真的没有服务器,而是指作为开发者,我不再需要关心和管理服务器,也不再需要配置环境,监控机器运行状态。与此同时,我也毫不在意这段 JS 代码最后落在 Cloudflare 的哪个边缘节点上执行。
这里提供一个运行在 Workers 上的经典反向代理脚本:仓库地址
复制 workers.js 中源代码到 Workers 项目中部署后,还需为其配置所代理的域名:在设置中找到变量和机密,添加名为 PROXY_HOSTNAME 的变量,值为所代理网站的域名。同时自定义域需要填写自己托管在 CF 之上的域名。

至此,已经 microsoft.com 下的所有页面已经被反代至 mysite.com,而中间的所有代理转发,在用户侧看起来是完全无感的。
(仅作示范,千万别去反代微软,容易封号)