Firebase Hosting 绑定自定义域名

从 Firebase 控制台加域名,到 DNS 记录、dig 验证命令、SSL 自动签发,本文给出确切配置和最常见失败原因。

Firebase Hosting 默认给你一个 *.web.app 域名。要换成 yourbrand.com,需要先在控制台加域名,然后到 DNS 那边证明你拥有这个域名。顺序对了 15 分钟搞定,顺序错了能折腾一下午。本文给出的 DNS 记录和验证命令就是关键。

问题背景

Firebase 通过 Let’s Encrypt 给 apex(yourbrand.com)和子域(www.yourbrand.com)签免费 SSL。整个流程分两步:所有权验证(TXT 记录)和域名指向(A 或 CNAME 记录)。失败基本来自:跳过验证、旧记录残留、registrar 那边 DNS 缓存。

判断标准

  • *.web.app 已经能开,现在想换成品牌域名。
  • 域名在 Cloudflare / Namecheap / Porkbun 之类的 registrar 手里。
  • 你能接受手动改 DNS——这一步省不了。
  • 你希望 apex 和 www 都能解析,不是只有一个。
  • 需要免费 SSL,不需要通配证书。

快速结论

先在 Firebase 加域名 → 通过 DNS 验证 → 再加另一个变体(apex 或 www),共用一张 SSL 证书。

开始前准备

  • 切换前至少 24 小时把现有 DNS 记录 TTL 调到 300s。
  • 把指向上一个 host 的旧 A 记录都删掉。
  • Firebase 项目 ID 和目标域名准备好。

实操步骤

  1. Firebase Console 加域名。 Console → Hosting → Add custom domain → 输入 yourbrand.com。Firebase 显示一条 TXT 记录值:
Host:  @  (或 yourbrand.com)
Type:  TXT
Value: hosting-site-verification=hZxK...                 (Firebase 生成)
TTL:   300
  1. registrar 那边加 TXT。 Cloudflare API 写法便于复用:
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records" \
  -H "Authorization: Bearer $CF_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "type": "TXT",
    "name": "@",
    "content": "hosting-site-verification=hZxK...",
    "ttl": 300
  }'
  1. 点 Verify 前先确认 TXT 传播:
dig +short TXT yourbrand.com @1.1.1.1
# "hosting-site-verification=hZxK..."
  1. 点 Verify 后 Firebase 会给出 A 记录(apex 指向其 anycast IP):
Host:  @          Type: A      Value: 199.36.158.100
Host:  @          Type: A      Value: 199.36.158.101

www 变体用 CNAME:

Host:  www        Type: CNAME  Value: your-project.web.app
  1. 加完 A / CNAME 后验证解析:
dig +short A yourbrand.com @1.1.1.1
# 199.36.158.100
# 199.36.158.101

dig +short CNAME www.yourbrand.com @1.1.1.1
# your-project.web.app.

返回里出现额外 IP(旧 host 的)就把那些残留记录删掉——DNS 会在好坏目标之间轮询。

  1. 等状态变成 “Connected”。 SSL 自动签发,15 分钟到几小时。curl 探测:
curl -vI https://yourbrand.com 2>&1 | grep -E 'subject:|issuer:|HTTP'
# subject: CN=yourbrand.com
# issuer: C=US, O=Let's Encrypt, CN=...
# HTTP/2 200
  1. 加第二个变体。 先加的 apex 现在加 www(反之亦然)。Firebase 会签发证书并自动建跳转到主域。

  2. 无痕窗口确认跳转:

curl -sI http://yourbrand.com       | head -2
# HTTP/1.1 301 Moved Permanently
# Location: https://yourbrand.com/

curl -sI https://www.yourbrand.com  | head -2
# HTTP/2 301
# location: https://yourbrand.com/   (如果 apex 是主域)
  1. 更新 Search Console、sitemap、canonical 标签。 新域名以 Domain property 验证后,重新提交 sitemap,让 Google 抓到新主域。

执行检查清单

  • TXT 验证记录删了或留着(无害)。
  • A / CNAME 至少在两个解析器(@1.1.1.1@8.8.8.8)下返回正确。
  • SSL 证书的 subject 与目标域名匹配——curl -vI 验证。
  • apex 和 www 都在 Firebase Hosting 注册了;一个主、一个 301。
  • 新域名在 Search Console 以 Domain property 验证。

上线后验证

  • 至少两条网络下 dig +short A yourbrand.com 只返回 Firebase IP。
  • curl -I 主域 HTTP/2 200、非主域 301。
  • Hosting → Custom domains 状态 “Connected” 打绿勾。
  • Lighthouse 或浏览器测一下没有 mixed content 警告。

容易踩的坑

  • 只加 A 记录忘了 TXT——验证一直 pending。
  • 上一个 host 的旧 A 没删——DNS 同时返回两份,访问飘忽。检测:dig +short A 返回多余 IP。
  • 在 apex 上用 CNAME(多数 registrar 不允许)——用 Cloudflare CNAME flattening 或者直接 A。
  • 只加 apex 或只加 www,丢一半流量。
  • Registrar 那边 DNS 缓存重——清缓存或等一小时。
  • Firebase 需要定期复验时把 TXT 删了——留着无害。
  • SSL 还没签发就开 Cloudflare 代理(“橙云”)——临时关掉代理,让 Firebase 签完再开。

FAQ

  • SSL 多久签发?: 通常一小时内。24 小时还没好的话,重新检查 DNS——签发要等传播。
  • apex 还是 www 当主域?: 2026 年大多数独立站把 apex 当主域。选一个,全站(Search Console、sitemap、canonical 标签)保持一致。
  • 能从另一个 host 无缝迁移吗?: 能。先把旧记录 TTL 调成 300 秒,用 Firebase preview channel 验证新配置没问题,再切换记录。
  • 记录加完了为什么还显示 “needs setup”?: 要么 DNS 还没传播,要么记录值和 Firebase 给的不完全一致。重新复制一次,并用 dig 验证。
  • 同一个域名 Vercel 几分钟就好,Firebase 就一直失败?: 两边的所有权模型不同。Vercel 在 CNAME / A 记录可解析后就自动签发证书;Firebase 必须先完成单独的 TXT 验证(域名在 Vercel 能用、Firebase 不行)。
  • 能用 Cloudflare 在 Firebase 前面吗?: 能。证书签发期间把 Cloudflare DNS 记录设 “DNS only”(灰云),签完再切 “Proxied”(橙云)。

相关阅读

标签: #独立开发 #Firebase #部署 / 托管 #域名 #DNS #SSL