适用场景:站点跑在 Cloudflare Worker / Pages 上(本例是 wemory.1postpro.com),对外域名在阿里云解析(本例是 wemory.bytefuse.cn)。阿里云侧不能把整站 NS 迁走。
记录日期:2026-09-17。界面文案以当时 Cloudflare / 阿里云云解析控制台为准。
1. 要解决什么
希望用户访问 https://wemory.bytefuse.cn 时,落到已经部署好的 Cloudflare Worker:wemory(自定义域名 wemory.1postpro.com)。
这件事拆成两层,必须分开想:
- 先让 HTTPS 通:浏览器能对
wemory.bytefuse.cn完成 TLS 握手,Cloudflare 也认这个 Host。 - 再决定地址栏:是继续显示
wemory.bytefuse.cn(绑定),还是 301 到wemory.1postpro.com(真跳转)。
本例最终两层都做了:源站证书挂在 wemory.bytefuse.cn 上,再由 Redirect Rule 把地址栏改成 https://wemory.1postpro.com。
2. 先选效果:绑定还是跳转
「跳转」口语里两种意思经常混在一起。选错了后面会配错记录。
效果 | 地址栏 | 实际发生的事 | 适合 |
|---|---|---|---|
绑定域名 | 一直是 | Cloudflare 用该 Host 的证书,把请求交给同一个 Worker | 对外正式入口、图片/资源 URL 要固定 |
真跳转 | 变成 | 先在 | 只想换入口、不保留旧域名 |
目标一律写 https://wemory.1postpro.com,不要写 http://。Worker 自定义域名本身就是 HTTPS,跳到 HTTP 会被浏览器当降级拦截。
3. 原理:为什么直接 CNAME 不行
3.1 CNAME 只改「去哪台机器」,不改「你是谁」
在阿里云把 wemory.bytefuse.cn CNAME 到 wemory.1postpro.com,递归解析最后拿到的是 Cloudflare 的 Anycast IP。浏览器随后发起 HTTPS 时:
- TCP 连到 Cloudflare IP。
- TLS 的 SNI、HTTP 的 Host 仍然是
wemory.bytefuse.cn, 不会因为 CNAME 变成1postpro.com。 - Cloudflare 必须在本账号里拥有这个主机名的证书和代理配置,才会正常应答。
所以「CNAME 到对方域名」≠「这个主机名已经接入 Cloudflare」。DNS 别名解决不了证书和 Host 匹配。
3.2 Cloudflare 的两条硬限制
- Error 1001:未接入 Cloudflare 的域名,不能 CNAME 到已经在 Cloudflare 上的域名(包括
*.workers.dev、wemory.1postpro.com)。官方说明:非 Cloudflare 域名不能 CNAME 到 Cloudflare 域名,除非该主机名已被加入某个 Cloudflare 账号。 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH:请求已经打到 Cloudflare IP,但边缘没有
wemory.bytefuse.cn的证书。浏览器表现为「使用了不受支持的协议」。本例在证书签发前就是这个报错;当时http://wemory.bytefuse.cn已经能打开站点,只有 HTTPS 握手失败。
Worker 上的 Custom Domain 只能加「本账号 Cloudflare DNS 里的域名」。bytefuse.cn 的 NS 在阿里云,所以不能在 Worker 里直接 Add Custom Domain 填 wemory.bytefuse.cn。
3.3 阿里云「显性 URL」也解决不了 HTTPS 入口
云解析的显性 URL 是 301/302,地址栏会变。限制是: 转发前的域名只支持 HTTP,不支持 HTTPS;转发目标可以是 HTTP 或 HTTPS。也就是 http://wemory.bytefuse.cn 可以跳,https://wemory.bytefuse.cn 不行。要让用户从 HTTPS 打开再跳走,源域名必须自己有证书。
4. 正确做法:把子域登记成 SaaS 自定义主机名
1postpro.com 已经在 Cloudflare 上。开启该 zone 的 Cloudflare for SaaS / Custom Hostnames 后,可以把别人(或自己另一套 DNS 里)的主机名登记进来。登记成功后,Cloudflare 才承认 SNI=wemory.bytefuse.cn,才会签发证书、才会按这个 Host 走规则和 Worker。
Free 计划可用,含 100 个自定义主机名;首次开通可能要绑支付方式。
4.1 各组件分工
组件 | 放在哪 | 干什么 |
|---|---|---|
阿里云 CNAME |
| 把流量指到 Cloudflare zone 上的接入点 |
| Cloudflare DNS, | SaaS 入口和 originless 回源。Worker 作源时用 |
Custom Hostname |
| 登记 |
ACME TXT | 阿里云 | 证明你拥有该主机名,CA 才肯签证书 |
Worker Route | 挂在 zone | Host 匹配后把请求交给 Worker |
Redirect Rule |
| 匹配 Host 后 301 到 |
4.2 错误路径 vs 正确路径
左边是直接 CNAME 到 Worker 域名,Cloudflare 不认这个 Host。右边先 CNAME 到自己 zone 里的接入点,再把主机名登记进 Custom Hostnames。
4.3 加上 301 之后,一次访问实际走什么
地址栏会变,是因为边缘在返回站点内容之前先下发了 301。源域名的证书仍然必要:没有它,浏览器连跳转响应都收不到。
5. 最终配置清单
下列是本例落地后的有效配置。换别的子域时,只替换主机名,结构不变。
5.1 阿里云 DNS(bytefuse.cn)
主机记录 | 类型 | 记录值 |
|---|---|---|
| CNAME |
|
| TXT | Cloudflare Custom Hostname 页当时给出的 token |
阿里云会自动补 .bytefuse.cn。主机记录不要写成 _acme-challenge.wemory.bytefuse.cn,否则实际主机名会变成双后缀。
5.2 Cloudflare DNS(网站 1postpro.com,不是 Worker 列表)
Name | Type | Content | Proxy |
|---|---|---|---|
| AAAA |
| Proxied 橙色云 |
| CNAME |
| Proxied 橙色云 |
5.3 Custom Hostname
- Fallback Origin:
saas-origin.1postpro.com(Status = Active) - Custom Hostname:
wemory.bytefuse.cn - Hostname status:Active
- Certificate status:Active(签发前是 Pending Validation TXT)
- 验证方式:TXT(也可用 HTTP;本例 CNAME 已指向 Cloudflare 后 HTTP 验证同样可行)
5.4 Worker Route
在 Worker wemory 的 Domains & Routes 里 Add → Route(不要选 Custom Domain):
- Zone:
1postpro.com - Route:
wemory.bytefuse.cn/*
若控制台拒绝「主机名不属于该 zone」,改用官方 SaaS 写法:zone 上 */* 指向该 Worker,再给 backup.1postpro.com、1postpro.com 等已有站点加更具体的 Route(Worker = None 或原来的 Worker)。更具体的路由优先。
5.5 Redirect Rule(要地址栏变化才加)
网站 1postpro.com → Rules → Create rule → Redirect Rule:
项 | 值 |
|---|---|
匹配方式 | Wildcard pattern |
Request URL |
|
Target URL |
|
Status code | 301 |
Preserve query string | 打开 |
http* 匹配 http/https;第二个 * 是路径,用 ${2} 带回。效果:
https://wemory.bytefuse.cn→https://wemory.1postpro.com/https://wemory.bytefuse.cn/help/→https://wemory.1postpro.com/help/
6. 操作步骤
按这个顺序做。Custom Domain 加在 Worker 上对外部 DNS 无效;Route 和 Custom Hostname 都挂在网站 1postpro.com 上。
- Cloudflare DNS 加 originless 源。 打开网站
1postpro.com→ DNS → Records。Type AAAA,Namesaas-origin,IPv6100::,Proxy 必须橙色云。保存后预览应为saas-origin.1postpro.com。 - 加客户接入 CNAME。 同一 DNS 页:Type CNAME,Name
customers,Targetsaas-origin.1postpro.com,橙色云。 - 设置 Fallback Origin。 同一网站 → SSL/TLS → Custom Hostnames。Fallback Origin 填
saas-origin.1postpro.com,直到 Status = Active。首次进入可能要开通 Cloudflare for SaaS。 - 登记自定义主机名。 Add Custom Hostname:
wemory.bytefuse.cn。Hostname status 会先变成 Active;Certificate 若选 TXT,会给出_acme-challenge.wemory.bytefuse.cn和一串 token。 - 阿里云改 CNAME。 删除原先
wemory→wemory.1postpro.com的 CNAME(那条会 1001 / 证书不匹配)。改为wemoryCNAMEcustomers.1postpro.com。 - 阿里云加 ACME TXT。 记录类型 TXT,主机记录
_acme-challenge.wemory,记录值 只填 token 那一串。不要把 TXT 名称填进记录值,也不要用主机记录wemory(和 CNAME 冲突,验证的也不是这个名字)。 - 加 Worker Route。 Workers & Pages → 点开
wemory→ Domains & Routes → Add → Route。Zone 选1postpro.com,Route 填wemory.bytefuse.cn/*。原来的 Custom Domainwemory.1postpro.com不要删。 - 等证书 Active。 TXT 在公网能查到后,回到 Custom Hostnames 点 Refresh。Certificate status 变为 Active 之前,用 HTTPS 打开一定是证书错误,属正常。签发后用无痕窗口测
https://wemory.bytefuse.cn。 - 若要地址栏变成 1postpro.com。 在网站
1postpro.com加上一节的 Redirect Rule 并 Deploy。测的时候用无痕窗口,避免旧页面缓存。
可观察结果:
- 只完成 1–8:地址栏仍是
wemory.bytefuse.cn,内容已是 Worker 站点(绑定)。 - 再完成 9:地址栏变成
https://wemory.1postpro.com/...(真跳转)。
7. 证书 TXT 校验:最容易填错的地方
Cloudflare 展示的是完整 FQDN:
- TXT name:
_acme-challenge.wemory.bytefuse.cn - TXT value:一串类似
WE8ekf2nVVZm-...的 token(以控制台当时值为准,续期会变)
阿里云「主机记录」只填前缀。对照:
正确 | 错误 | |
|---|---|---|
主机记录 |
|
|
记录值 | 只有 token | 把 |
wemory 已经是 CNAME 时,同一主机再加 TXT 会冲突。验证主机名是 _acme-challenge.wemory,和 CNAME 不是同一条记录,所以可以并存。
Hostname status = Active 只表示 Cloudflare 开始代理这个 Host; Certificate status 才表示 HTTPS 能用。两条都要 Active。
证书签发后这条 TXT 建议留着,续期还要用。
8. 常见故障
现象 | 含义 | 处理 |
|---|---|---|
Error 1001 | 非 Cloudflare 域名 CNAME 到了 Cloudflare 域名 | CNAME 目标改成自己 zone 内的 |
ERR_SSL_VERSION_OR_CIPHER_MISMATCH | 流量到了 Cloudflare,但没有该 Host 的证书 | 检查 Custom Hostname 证书是否 Active、TXT 是否解析到公网 |
HTTP 200、HTTPS 失败 | 代理已通,只差证书 | 补 TXT / 等签发;不要误以为 Route 没配好 |
地址栏不变 | 绑定成功,没有 301 | 加 Redirect Rule;不是 DNS 配错 |
规则提示 hostname 不在本 zone | Redirect / Route 校验按 zone 域名来 | Route 可改 |
普通窗口仍报证书错误 | 浏览器缓存了失败的 TLS | 无痕窗口;证书已 Active 后再测 |
Worker 里做跳转的备用写法(Redirect Rule 不生效时):
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (url.hostname === "wemory.bytefuse.cn") {
url.hostname = "wemory.1postpro.com";
url.protocol = "https:";
return Response.redirect(url.toString(), 301);
}
// ...原有逻辑
},
};9. 不要删、不要做
跳转生效后也不要删:
- 阿里云
wemoryCNAME →customers.1postpro.com - Custom Hostname
wemory.bytefuse.cn _acme-challenge.wemory的 TXTsaas-origin/customers两条橙色云记录- Worker 上原有的 Custom Domain
wemory.1postpro.com
这些是源域名 HTTPS 和 301 的前置条件。删掉之后浏览器还没跳就会在 TLS 阶段失败。
不要做:
- CNAME 到
wemory.1postpro.com或*.workers.dev - 在 Worker 里对
bytefuse.cn点 Add Custom Domain - 用隐性 URL(iframe),图片和跨域几乎一定坏
- 为了这一个子域,把整个
bytefuse.cn的 NS 迁到 Cloudflare(同域上还有其它解析,例如走 EdgeOne 的记录)
10. 以后换子域怎么套用
把 wemory / bytefuse.cn / 1postpro.com / Worker 名换成新的即可,骨架不变:
- Cloudflare 上要有一个已经托管的 zone,当作 SaaS 区。
- 橙色云
saas-origin(100::)+customersCNAME。 - Custom Hostname 登记外部主机名,按页面做 HTTP 或 TXT 验证。
- 外部 DNS:主机名 CNAME 到
customers.<你的zone>。 - Worker Route 挂在 SaaS zone 上。
- 需要地址栏变化时,再加 Redirect Rule 或 Worker 301。
只绑定、不跳转:做到第 5 步停。只跳转、还要 HTTPS 入口:第 1–5 步仍必须做,第 6 步才改地址栏。
