搞机男  Sub  Who  Projects  

免费域名怎么接入 Cloudflare Workers:用 SaaS 自定义主机名借道

手里要是有个免费二级域名,想拿它跑 Cloudflare Workers 或 Pages,多半会卡在第一步:域名本身不在 Cloudflare 托管,常规的加站点、绑自定义域名那套走不通。硬接的结果也都差不多,要么证书签不下来,要么打开是 Error 1001,要么 502,再要么干脆访问不了。

这类问题多数不是域名不行,而是接法不对。正确思路是借道:拿一个已经接入 Cloudflare 的主域名当跳板,用它的 SaaS 自定义主机名功能把免费域名「挂」进来,流量进来之后再路由到你的项目。下面以 Workers 为例说一遍,Pages 的接入思路相同,区别只在最后承接流量的项目。

先说原理

整个链路是这样走的:访客打开免费域名,DNS 把它指到主域名下的一个回源子域名;Cloudflare 收到请求后,靠自定义主机名的登记认出这是要访问的域名;再按 Worker 路由把请求交给对应的项目。证书也由 Cloudflare 在这个环节代为签发,所以免费域名那边的 DNS 不需要迁走。

开始之前需要备齐三样:一个 Cloudflare 账号;一个已经接入 Cloudflare 的主域名,且已开通 SaaS(自定义主机名)功能;项目已经部署到 Workers 并能正常访问。

以下用 foo.com 指已接入 Cloudflare 的主域名,用 foo.bar 指要接入的免费域名,照着替换成自己的即可。

第一步:建回源记录

在 foo.com 的 DNS 管理里新建一条记录:

worker.foo.com  IN  AAAA  100::

代理状态要打开(小黄云)。100:: 是 Cloudflare 内部的占位地址,意思就是这条记录背后没有真实服务器,它的作用只是给后面的自定义主机名当回退源,真正的流量由 Worker 路由决定去向。填真实 IP 反而容易把链路搞乱。

第二步:给 Worker 加路由

打开这个 Worker 的设置,找到路由(Routes),添加一条:

路由模式:foo.bar/*
区域:选择 foo.com

注意区域选的是 foo.com 所在的区域,不是 foo.bar。这样 Cloudflare 收到发往 foo.bar 的请求时,就知道该交给哪个 Worker。只接这一个域名时写精确模式就够了;写成 */* 也能匹配所有进来的流量,但会连 foo.com 自己的流量一起接管,没有多域名需求时不建议这么写。

第三步:设置回退源并添加自定义主机名

进入 foo.com,打开 SSL/TLS → 自定义主机名:

  1. 把回退源(Fallback Origin)填成第一步建的 worker.foo.com,如果保存不了,点一下输入框右侧的编辑按钮再保存;
  2. 添加自定义主机名,填 foo.bar。

添加成功后页面上一般一分钟内就会识别出来。接下来 Cloudflare 会给出两条用于签发证书的 TXT 验证记录,先别急着填,第四步有个容易错的点。

第四步:在免费域名的 DNS 里做证书验证

Cloudflare 给出的验证记录,主机名是完整写法,类似:

_acme-challenge.foo.bar  IN  TXT  一串验证值

但 foo.bar 的 DNS 控制台默认就工作在你的域名之下,添加记录时主机名只需要填相对部分,也就是只填:

_acme-challenge  IN  TXT  验证值

两条验证记录的主机名相同,这是正常的,TXT 记录本来就允许同名多条,一起填进去即可。这一步是整篇最容易出错的地方:如果把 Cloudflare 给的完整主机名原样粘贴,实际生效的记录会多套一层域名,证书会一直卡在验证中。

第五步:把免费域名指过来

还是在 foo.bar 的 DNS 控制台里,加两条记录:

@    IN  ALIAS   worker.foo.com
www  IN  CNAME   worker.foo.com

根域名这一条要用 ALIAS 而不是 CNAME,这是 DNS 规范对根记录的限制,能不能加取决于免费域名那边的控制台是否支持 ALIAS(有的叫 ANAME),支持的话照上面填就行。

等生效

免费域名那边的解析一般半分钟左右就生效,但证书要等 Cloudflare 在全球确认完验证记录才会签发,通常需要 5 到 10 分钟。回到自定义主机名页面刷新,状态变成可用、证书显示已激活之后,用 https 打开 foo.bar,能正常访问就算接完了。

最后留几个排错方向:打开报 1001,先查第五步的记录有没有指对、自定义主机名有没有添加成功;证书迟迟不激活,优先回头查第四步的 TXT 主机名是不是多写了一层;出现 502,多半是回源记录没开代理,或者回退源没有设置成功。


Carpe Diem.
Contact me at tink.im. 回到顶部