你 Google 自己的品牌内容,SERP 显示 your-app.vercel.app 或 your-site.web.app 而不是 yourdomain.com。点进去——一样的内容。平台 URL 在你加自定义域名之前就被收录,Google 没自然迁移。自定义域名不会”自动赢”——你要么把平台 URL 重定向到自定义域名、要么 noindex 平台 URL、要么 canonical 指向自定义域名。没有这些显式信号,Google 可能继续显示平台 URL,尤其对老的已收录页面。
常见原因
按命中率从高到低。
1. 先在平台 URL 上线、后加自定义域名
最常见模式:你部署到 app.vercel.app,攒了一些链接 / 流量,然后才加自定义域名。Vercel 两个都服务。Google 早已收录平台 URL。
怎么判断:Google 搜 site:your-app.vercel.app。出现已收录页面就是这条。
2. 没指向自定义域名的 canonical
页面没有 <link rel="canonical" href="https://yourdomain.com/...">,或者 canonical 指向平台 URL。
怎么判断:
curl -s "https://your-app.vercel.app/article" | grep canonical
canonical 指向 vercel.app 就是 bug。
3. 平台 URL 没重定向到自定义域名
Vercel 和 Firebase 两个 URL 都服务。没显式重定向,两个都活着。
怎么判断:
curl -sI "https://your-app.vercel.app/" | head -3
返回 200(不是 301)= 没配重定向。
4. 预览部署可被索引
Vercel 预览和 Netlify deploy preview 没禁就能爬。每个预览都是生产的近重复。
怎么判断:Google 搜 site:vercel.app 加你的项目名。预览 URL 出现 = 被收录了。
5. Firebase web.app 不能完全禁用
Firebase Hosting 设计上同时服务你的自定义域名和 *.web.app URL。web.app 保持可访问;唯一能 noindex 它的办法是通过 robots.txt 或 HTML 里的 meta 标签。
怎么判断:Google 搜 site:web.app yoursite。出结果 = web.app 被收录。
6. 外链指向平台 URL
哪怕你这边修了,老外链(博客文章、社交媒体)还指向 your-app.vercel.app。每一条都喂养平台 URL 的权威。
怎么判断:Ahrefs / Majestic 外链报告。很多外链引用平台 URL = 有外部持续性。
最短修复路径
第 1 步:永远吐自定义域名的 canonical
每页 <head> 必须有:
<link rel="canonical" href="https://yourdomain.com/article-path/" />
哪怕从平台 URL 服务也要有。canonical 告诉 Google”这是真实 URL”。
---
// layout 里
const canonicalUrl = new URL(Astro.url.pathname, 'https://yourdomain.com').toString();
---
<link rel="canonical" href={canonicalUrl} />
第 2 步:把平台 URL 重定向到自定义域名
Vercel — 域名设置 → 自定义域名设为 primary → 给平台 URL 打开 “redirect to”。
代码里(更可靠):
// astro.config.mjs 或 middleware
export default defineConfig({
site: 'https://yourdomain.com',
});
vercel.json:
{
"redirects": [
{
"source": "/:path*",
"has": [{ "type": "host", "value": "your-app.vercel.app" }],
"destination": "https://yourdomain.com/:path*",
"permanent": true
}
]
}
Netlify — Domain management → 自定义设为 primary。Netlify 自动重定向 *.netlify.app 到它。
Firebase web.app — 不能完全禁用但可用服务端检查从 web.app 域名服务时吐 noindex:
{Astro.url.hostname.endsWith('.web.app') && (
<meta name="robots" content="noindex" />
)}
第 3 步:预览部署 noindex
vercel.json:
{
"headers": [
{
"source": "/(.*)",
"has": [{ "type": "host", "value": "(?!yourdomain\\.com).*" }],
"headers": [{ "key": "X-Robots-Tag", "value": "noindex" }]
}
]
}
任何非 canonical 域名的请求都吐 X-Robots-Tag: noindex。
第 4 步:Search Console 提交 canonical URL
对每个被收录的平台 URL,Search Console → URL Inspection → 输自定义域名 URL → “Request Indexing”。
不要把平台 URL 加成独立 property——那会告诉 Google 当独立站追踪。
第 5 步:移除老 GSC property(如果有)
如果首次上线时把 https://your-app.vercel.app/ 加成 Search Console property,删掉。数据不删(需要先导出),但不要继续向它的历史添加。
第 6 步:等合并
Google 逐步把平台 URL 退索引。site:your-app.vercel.app 结果应该在 2-8 周内减少。
哪些情况可能不是你操作错了
某些平台(Firebase)让完全禁用平台 URL 不可能。Workaround 有(meta 标签 noindex)但没硬 301 干净。
容易误判的情况
以为自定义域名加了就自动赢。Google 需要显式信号:canonical link tag、301 重定向、或平台 URL 上的 noindex。
预防建议
- 任何新项目第一天:生产环境 noindex 平台 URL、重定向到自定义域名。
- 所有页面模板里 canonical 标签指向自定义域名,不管哪个 URL 服务请求。
- 不要在 Search Console 把平台 URL 验证成独立 property。
- 预览 / staging 环境通过 X-Robots-Tag header 配 noindex。
- 每季度审
site:platform-url提前发现新收录页面。
FAQ
- 能完全禁用平台 URL 吗? 因平台而异。Vercel 允许只绑定行为。Firebase web.app 设计上保持可访问。
- Google 最终会自己搞清吗? 慢且不可靠。显式信号(canonical、301、noindex)快得多。