利用 cf 隐藏端口(无需修改 ns)并绕过 CORS

借鉴其他大佬的经验,增加了一个博客订阅页面,后端用的 FreshRSS。一开始用的套 cloudflare 的域名,比较麻烦的地方在于需要增加 CORS 规则,而且国内访问比较慢,最致命的是 FreshRSS 页面有时候刷不出剩下的条目。所以就在想,有没有办法可以多个域名访问:带端口的直通域名 A 自己使用;增加一个跟博客同域的子域名 B 用于前端 fetch。当然,最简单的是把域名 B 的 NS 记录迁移到 cf。那么有没有仅修改 CNAME 的方式呢?
下面就是最新成果:

设置 FreshRSS 基础域名

FreshRSS 用了 php 作为配置文件,这就很方便了,找到data/config.php,修改以下字段:

config.php
base_url: 'https://' . strtolower($_SERVER["HTTP_HOST"]) . (preg_match('{^/rss/}', $_SERVER["REQUEST_URI"]) ?  "/rss" : ""),

具体含义就不罗嗦了,根据需要自行修改。

配置 cloudflare SaaS 服务

这个网上一堆教程,比较重要的前提是有绑定 cf 的域名 C 作为 fallback origin。可能的坑包括:

  • 解析记录需要明确的字段,比如 rss,泛域名字符“*”是不可以的
  • 验证完域名 B 的 txt 记录之后别忘了还有个 ssl 相关的 txt 记录
  • 回源子域名 C 不能是服务器上绑定过反向代理或虚拟主机的

修改端口和域名解析

为回源域名增加 Origin Rules,转发所有流量到服务器的指定端口,也可以根据需要增加 condition。回到域名 B 的 DNS 配置页,增加指向回源子域名 C 的 CNAME 规则。再到服务器增加一个反代或者虚拟服务器规则,注意这里设定的是子域名 B 的,而不是 C 的,端口填 Origin Rules 指定的值。如果还有路由层,再在路由器上增加一个转发规则。

测试

测试前记得在 cf 上打开 develop mode 暂时关闭 cache。使用子域名 B 访问,看看是否能正确打开 FreshRSS 登录页。至于跨域,是我想多了..子域名也算跨域。xml 也不能用 JSONP,除了 以一些不稳定的公共 api,也只剩 HTTP Header 一条路了。

好了,想到这么多就先写下来。cf 不愧是网络瑞士军刀,穿透、跨域、反代、边缘节点..你能想到的需求总能在这里找到实现方式,而且大部分功能是免费的!另外,在论坛发帖求助后有大佬展示了 cf tunnel + SaaS 实现的 CNAME 级域名转发,有兴趣的可以点击这里围观。Bye~~