一劳永逸解决跨域问题 —— Use Cloudflare Worker as MitM

2022-04-03 Views browser

一种通用的解决浏览器跨域请求的方法

Man in the ~~Mirror~~Middle

本来之前折腾出来的时候想着记录一下的,但找完配图之后就一直搁置了,时间一长再回过头来填坑又觉得太简单,没啥动力写得很细了。

长话短说,之前基于 notion api 做了一个 SPA,差不多就是读取 notion database 的数据做一些 notion 原生不支持的统计维度展示。本地开发的时候可以用 dev server proxy,开发到一半意识到生产环境浏览器直接调用 notion api 会有跨域问题。卡了一会,又去 MDN 复习了一下 CORS 的详细说明,回忆起一个盲点:跨域是一个浏览器的行为,数据传输都已经完成了,但是浏览器收到之后判断是跨域请求,就拒绝使用返回的数据并且告警。

看到这里就联系上了本地常用的一种绕过跨域的方式:以非安全模式启动 chrome。但是 SPA 上线后不可能用这种方式了。正好我的域名是托管在 cloudflare 上的,它家有一个叫 worker 的玩意儿,流量可以按自定义的规则走 worker 过滤一下。于是另一个思路出来了:所有到 notion 的请求走一遍 worker,worker 里面覆盖 header,浏览器再收到的时候就不会判断是跨域请求。

随后我按这个思路 google 了一下,果然有人和我想到一块去了,而且已经有人把代码开源出来了,Great!比较了几个类似的玩法,组合测试了一下,我的场景还算比较简单的,基本没啥问题,上线!

理论上这种玩法儿可以解决所有的跨域问题,cloudflare 的免费账户也可以使用 worker,只是有流量限制,我自己的 worker 只处理了到 notion 的请求,GitHub 上也有处理任意跨域请求的 worker 脚本代码

赏 支付宝扫码打赏 微信打赏

△