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 和目标域名准备好。
实操步骤
- Firebase Console 加域名。 Console → Hosting → Add custom domain → 输入
yourbrand.com。Firebase 显示一条 TXT 记录值:
Host: @ (或 yourbrand.com)
Type: TXT
Value: hosting-site-verification=hZxK... (Firebase 生成)
TTL: 300
- 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
}'
- 点 Verify 前先确认 TXT 传播:
dig +short TXT yourbrand.com @1.1.1.1
# "hosting-site-verification=hZxK..."
- 点 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
- 加完 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 会在好坏目标之间轮询。
- 等状态变成 “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
-
加第二个变体。 先加的 apex 现在加 www(反之亦然)。Firebase 会签发证书并自动建跳转到主域。
-
无痕窗口确认跳转:
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 是主域)
- 更新 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”(橙云)。