返回博客

博客

把自己的域名指向跟踪服务器:CNAME、证书,以及 Cloudflare 的 1014 错误

发布于 · 阅读约 3 分钟

你从我们这里得到的第一个主机名,是 signalhost.io 下的一个随机标签。它能用,对很多网站也够用——它已经不是 googletagmanager.com 了。但你自己域名的子域名,才是能扛过每一份过滤列表和每一条浏览器规则的版本,因为对浏览器来说,它就是你的网站。做到这一点只需要一条 DNS 记录和几分钟。稍微做错一点,就会出现一个你这一侧的任何东西都解释不了的错误信息,所以这里给出完整流程,包括失败的情况。

为什么要用你自己网站的子域名

两个原因,而且不一样。对广告拦截器来说,请求的主机名在列表上,它就是第三方;signalhost.io 今天不在任何列表上,明天可能就在了;yoursite.com 永远不会在。对浏览器来说,由 metrics.yoursite.com 的响应设置的 Cookie 是 yoursite.com 的第一方 Cookie,享有随之而来的更长有效期,而来自另一个域名的 Cookie 会被限制或拒绝。跟踪服务器在两种情况下是同一个。改变它被如何对待的,是主机名。

那条记录

在你的 DNS 服务商处添加一条 CNAME,把你选的子域名指向我们的仅 DNS 端点:

metrics.yoursite.com.   CNAME   tenants.signalhost.io.

不是指向你的随机租户主机名,也不是指向通配符。tenants.signalhost.io 是我们专门为此发布的名称,为什么必须是这个名称,下一节会解释。

如果你自己的域名在 Cloudflare 上,创建记录时请关闭代理——灰色云朵,「仅 DNS」。开启代理的记录会把你访客的请求经由你的 Cloudflare 账号转到我们这里,而下面的证书步骤无法通过它完成。

Cloudflare 的 1014 错误,以及为什么目标必须是仅 DNS

我们自己的主机名在 Cloudflare 后面。如果客户把 CNAME 指向我们的某个代理名称——通配符或某个租户主机名——他们的流量就会以一个属于另一个 Cloudflare 账号的主机名到达 Cloudflare。Cloudflare 会以 1014 错误「CNAME Cross-User Banned」拒绝它。显示该错误的页面是 Cloudflare 的,既不提我们也不提你,你的 DNS、网站和浏览器里没有任何东西能解释它。

tenants.signalhost.io 是特意不开代理的:它直接解析到我们的服务器,所以指向它的 CNAME 直接就能用。控制台的 DNS 检查会按名称识别代理目标的情况并告诉你改什么,但更快的做法是从一开始就不这么做。

证书

记录一旦解析,我们就为你的主机名申请 Let's Encrypt 证书。验证方式是 HTTP-01:Let's Encrypt 通过明文 HTTP 从该名称的 80 端口获取一个特定路径,我们做出应答。用明文 HTTP 是因为证书还不存在——正在申请的就是它——这也是我们的边缘唯一会应答的非加密路径。它只是一次 nonce 比对;通过这条路到不了别的任何地方。

预计需要几分钟。控制台按顺序显示三个步骤:CNAME 解析、证书签发、主机名开始服务。CNAME 已绿而证书步骤卡住,几乎总是因为你这边的记录开了代理——Cloudflare 用它自己的证书和页面应答了验证请求,Let's Encrypt 看到的是错误的东西。

开始服务之后

你网页容器中的 Google 代码带有服务器容器 URL,当主机名开始服务时,我们会把它改写为自定义域名并重新发布容器;如果你移除了域名,我们会把它改回租户主机名。你网站上的代码片段不变;它加载容器,容器知道该往哪里发送。

所以移除的顺序很重要。先在控制台移除域名,再删除 DNS 记录。如果先删了记录,在控制台察觉之前,容器仍会把你的访客指向一个已经无法解析的名称。

如果不起作用

  • 浏览器里出现 1014 错误:CNAME 指向了我们的代理名称。把目标改为 tenants.signalhost.io。
  • CNAME 已绿,证书等待超过十五分钟:你的记录开了代理。在 DNS 服务商处把云朵改成灰色。
  • CNAME 一直不变绿:检查同一名称上是否有冲突的 A 或 AAAA 记录——CNAME 不能与它们共存——并给传播留出最多一小时。
  • 已在服务,但容器页面没有来自新名称的流量:网页容器尚未重新发布。这会在主机名上线后的几分钟内发生;容器页面会显示代码当前指向哪个主机名。

别再把数据丢给广告拦截器

每月一万次请求,长期免费。四分钟就能知道它是否有用。