搜索结果出现旧部署 URL 而不是自定义域名

Google 收录 `your-app.vercel.app` 或 `your-site.web.app` 而不是你的自定义域名——为什么、怎么修。

你 Google 自己的品牌内容,SERP 显示 your-app.vercel.appyour-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)快得多。

相关阅读

标签: #域名 #DNS #SSL #排查 #部署 URL