Skip to content

阿里云域名接入 Cloudflare:绑定、证书与 301 跳转

9/17/2026

📌

适用场景:站点跑在 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. 先选效果:绑定还是跳转 ​

「跳转」口语里两种意思经常混在一起。选错了后面会配错记录。

效果

地址栏

实际发生的事

适合

绑定域名

一直是 wemory.bytefuse.cn

Cloudflare 用该 Host 的证书,把请求交给同一个 Worker

对外正式入口、图片/资源 URL 要固定

真跳转

变成 wemory.1postpro.com

先在 bytefuse.cn 上完成 HTTPS,再返回 301/302

只想换入口、不保留旧域名

💡

目标一律写 https://wemory.1postpro.com,不要写 http://。Worker 自定义域名本身就是 HTTPS,跳到 HTTP 会被浏览器当降级拦截。

3. 原理:为什么直接 CNAME 不行 ​

3.1 CNAME 只改「去哪台机器」,不改「你是谁」 ​

在阿里云把 wemory.bytefuse.cn CNAME 到 wemory.1postpro.com,递归解析最后拿到的是 Cloudflare 的 Anycast IP。浏览器随后发起 HTTPS 时:

  1. TCP 连到 Cloudflare IP。
  2. TLS 的 SNI、HTTP 的 Host 仍然是 wemory.bytefuse.cn, 不会因为 CNAME 变成 1postpro.com。
  3. Cloudflare 必须在本账号里拥有这个主机名的证书和代理配置,才会正常应答。

所以「CNAME 到对方域名」≠「这个主机名已经接入 Cloudflare」。DNS 别名解决不了证书和 Host 匹配。

3.2 Cloudflare 的两条硬限制 ​

  1. Error 1001:未接入 Cloudflare 的域名,不能 CNAME 到已经在 Cloudflare 上的域名(包括 *.workers.dev、wemory.1postpro.com)。官方说明:非 Cloudflare 域名不能 CNAME 到 Cloudflare 域名,除非该主机名已被加入某个 Cloudflare 账号。
  2. 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 wemory

bytefuse.cn 权威 DNS

把流量指到 Cloudflare zone 上的接入点 customers.1postpro.com

customers / saas-origin

Cloudflare DNS,1postpro.com,橙色云

SaaS 入口和 originless 回源。Worker 作源时用 AAAA 100::

Custom Hostname

1postpro.com → SSL/TLS → Custom Hostnames

登记 wemory.bytefuse.cn 并签发它的证书

ACME TXT

阿里云 _acme-challenge.wemory

证明你拥有该主机名,CA 才肯签证书

Worker Route

挂在 zone 1postpro.com 上,不是 Worker 的 Custom Domain

Host 匹配后把请求交给 Worker wemory

Redirect Rule

1postpro.com → Rules

匹配 Host 后 301 到 wemory.1postpro.com(可选,要地址栏变化才加)

4.2 错误路径 vs 正确路径 ​

左边是直接 CNAME 到 Worker 域名,Cloudflare 不认这个 Host。右边先 CNAME 到自己 zone 里的接入点,再把主机名登记进 Custom Hostnames。

4.3 加上 301 之后,一次访问实际走什么 ​

地址栏会变,是因为边缘在返回站点内容之前先下发了 301。源域名的证书仍然必要:没有它,浏览器连跳转响应都收不到。

5. 最终配置清单 ​

下列是本例落地后的有效配置。换别的子域时,只替换主机名,结构不变。

5.1 阿里云 DNS(bytefuse.cn) ​

主机记录

类型

记录值

wemory

CNAME

customers.1postpro.com

_acme-challenge.wemory

TXT

Cloudflare Custom Hostname 页当时给出的 token

阿里云会自动补 .bytefuse.cn。主机记录不要写成 _acme-challenge.wemory.bytefuse.cn,否则实际主机名会变成双后缀。

5.2 Cloudflare DNS(网站 1postpro.com,不是 Worker 列表) ​

Name

Type

Content

Proxy

saas-origin

AAAA

100::(originless,流量交给 Worker)

Proxied 橙色云

customers

CNAME

saas-origin.1postpro.com

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

http*://wemory.bytefuse.cn/*

Target URL

https://wemory.1postpro.com/${2}

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 上。

  1. Cloudflare DNS 加 originless 源。 打开网站 1postpro.com → DNS → Records。Type AAAA,Name saas-origin,IPv6 100::,Proxy 必须橙色云。保存后预览应为 saas-origin.1postpro.com。
  2. 加客户接入 CNAME。 同一 DNS 页:Type CNAME,Name customers,Target saas-origin.1postpro.com,橙色云。
  3. 设置 Fallback Origin。 同一网站 → SSL/TLS → Custom Hostnames。Fallback Origin 填 saas-origin.1postpro.com,直到 Status = Active。首次进入可能要开通 Cloudflare for SaaS。
  4. 登记自定义主机名。 Add Custom Hostname:wemory.bytefuse.cn。Hostname status 会先变成 Active;Certificate 若选 TXT,会给出 _acme-challenge.wemory.bytefuse.cn 和一串 token。
  5. 阿里云改 CNAME。 删除原先 wemory → wemory.1postpro.com 的 CNAME(那条会 1001 / 证书不匹配)。改为 wemory CNAME customers.1postpro.com。
  6. 阿里云加 ACME TXT。 记录类型 TXT,主机记录 _acme-challenge.wemory,记录值 只填 token 那一串。不要把 TXT 名称填进记录值,也不要用主机记录 wemory(和 CNAME 冲突,验证的也不是这个名字)。
  7. 加 Worker Route。 Workers & Pages → 点开 wemory → Domains & Routes → Add → Route。Zone 选 1postpro.com,Route 填 wemory.bytefuse.cn/*。原来的 Custom Domain wemory.1postpro.com 不要删。
  8. 等证书 Active。 TXT 在公网能查到后,回到 Custom Hostnames 点 Refresh。Certificate status 变为 Active 之前,用 HTTPS 打开一定是证书错误,属正常。签发后用无痕窗口测 https://wemory.bytefuse.cn。
  9. 若要地址栏变成 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(以控制台当时值为准,续期会变)

阿里云「主机记录」只填前缀。对照:

正确

错误

主机记录

_acme-challenge.wemory

wemory 或完整 FQDN

记录值

只有 token

把 _acme-challenge.wemory.bytefuse.cn 也当成一条记录值

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 内的 customers.1postpro.com,并完成 Custom Hostname

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 可改 */* 再排除其它主机;Redirect 仍可用通配 URL。不行就在 Worker 开头按 Host 返回 301

普通窗口仍报证书错误

浏览器缓存了失败的 TLS

无痕窗口;证书已 Active 后再测

Worker 里做跳转的备用写法(Redirect Rule 不生效时):

js
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. 不要删、不要做 ​

跳转生效后也不要删:

  • 阿里云 wemory CNAME → customers.1postpro.com
  • Custom Hostname wemory.bytefuse.cn
  • _acme-challenge.wemory 的 TXT
  • saas-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 名换成新的即可,骨架不变:

  1. Cloudflare 上要有一个已经托管的 zone,当作 SaaS 区。
  2. 橙色云 saas-origin(100::)+ customers CNAME。
  3. Custom Hostname 登记外部主机名,按页面做 HTTP 或 TXT 验证。
  4. 外部 DNS:主机名 CNAME 到 customers.<你的zone>。
  5. Worker Route 挂在 SaaS zone 上。
  6. 需要地址栏变化时,再加 Redirect Rule 或 Worker 301。

只绑定、不跳转:做到第 5 步停。只跳转、还要 HTTPS 入口:第 1–5 步仍必须做,第 6 步才改地址栏。