免费域名怎么接入 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 → 自定义主机名:
- 把回退源(Fallback Origin)填成第一步建的
worker.foo.com,如果保存不了,点一下输入框右侧的编辑按钮再保存; - 添加自定义主机名,填 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,多半是回源记录没开代理,或者回退源没有设置成功。