子域名还是子目录:SEO 权重集中的正确选法

`blog.yoursite.com` 还是 `yoursite.com/blog`?用 Vercel / Next / Cloudflare rewrite 配置让 SEO 集中在一个域名。

给站加一块(博客、文档、帮助中心)有两种 URL 选择:子域名(blog.yoursite.com)或子目录(yoursite.com/blog)。看起来可互换,其实不是——至少 SEO 上不是。下面是决策和两种路径的具体 rewrite 配置。

问题背景

Google 十年前就说过子域名和子目录都能用。实际上子目录把权威集中在一个域名,子域名更像独立站——可能分散你的 SEO 资产。多数独立内容场景子目录是对的。即使博客在另一个仓库,用反代或平台 rewrite 也能把子目录搭起来。

判断标准

  • 在已有品牌域名下加博客或文档区。
  • 想让一个信任信号下的域名权威更快增长。
  • 不同板块没跑在完全独立技术栈上。
  • 主站和新区会大量互链。

快速结论

想计入同一 SEO 实体的内容默认子目录(yoursite.com/blog)。技术上隔离、托管在不同平台、或真的独立产品时用子域名(docs.yoursite.comapp.yoursite.com)。

开始前准备

  • 知道博客和主站是否同仓库。
  • host 支持 rewrite(Vercel、Netlify、Cloudflare Workers、Next.js)。
  • canonical 标签按所选结构规划。

实操步骤

  1. 按目的选,不按基础设施。 同品牌同受众 → 子目录。独立产品或独立栈 → 子域名。

  2. 同仓库的子目录方案: /blog 路由到博客。Astro:

src/pages/blog/index.astro
src/pages/blog/[...slug].astro

Next.js:

app/blog/page.tsx
app/blog/[slug]/page.tsx
  1. 博客在不同仓库 / 不同 host 的子目录方案: 用平台 rewrite。主站 Vercel vercel.json
{
  "rewrites": [
    { "source": "/blog", "destination": "https://blog-app.vercel.app/" },
    { "source": "/blog/:path*", "destination": "https://blog-app.vercel.app/:path*" }
  ]
}

Next.js next.config.js

module.exports = {
  async rewrites() {
    return [
      { source: '/blog', destination: 'https://blog.internal.host/' },
      { source: '/blog/:path*', destination: 'https://blog.internal.host/:path*' },
    ];
  },
};

Cloudflare Workers:

export default {
  async fetch(request) {
    const url = new URL(request.url);
    if (url.pathname.startsWith('/blog')) {
      const upstream = new URL(url.pathname.replace(/^\/blog/, ''), 'https://blog.internal.host');
      return fetch(upstream, request);
    }
    return fetch(request);
  },
};

博客自己渲染页面,但 Google 看到的是 yoursite.com/blog/...

  1. 子域名方案(确实要分开时):DNS 配子域名指向各自 host,每个 host 自己处理 SSL 和内容。Search Console 子域名加为独立 property。

  2. canonical 标签在所选结构内。 反代的博客 canonical 必须指子目录 URL,不是上游子域:

<link rel="canonical" href="https://yoursite.com/blog/foo/" />

部署后验证:

curl -sL https://yoursite.com/blog/foo/ | grep -i canonical
# rel="canonical" href="https://yoursite.com/blog/foo/"  ✓
  1. 每个 property 一份 sitemap。 子目录方案=一份 sitemap 覆盖所有板块:
<!-- yoursite.com/sitemap.xml -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://yoursite.com/</loc></url>
  <url><loc>https://yoursite.com/blog/</loc></url>
  <url><loc>https://yoursite.com/blog/foo/</loc></url>
  <!-- ... -->
</urlset>
  1. 主站与该区互链多写一点——这是集中权威的关键。Header、footer、内容里多次出现。

  2. 验证反代正确穿透:

# 响应头应该像主站,不是上游
curl -sI https://yoursite.com/blog/ | head
# server: Vercel  (不是上游 host)
# 博客页面不应混合上游 host 引用

执行检查清单

  • 子目录 rewrite 工作正常(curl -I 验证)。
  • 博客内 canonical 指 yoursite.com/blog/...,不指上游。
  • 一 property 一 sitemap;sitemap 含主域名下的博客 URL。
  • 主站和博客之间内链密集。
  • 上游 host(如有)不通过单独子域名对外。

上线后验证

  • Search Console URL Inspection 抽查博客 URL,canonical 是子目录。
  • 反代输出仅引用 yoursite.com
  • 4-8 周后权威信号(曝光、收录数)集中在主域 property。

容易踩的坑

  • 为了基础设施方便选子域名,然后纳闷博客排不上去——主站 SEO 流不过来。
  • 为了 Docusaurus 独立部署方便把文档放子域名——用 rewrite 修部署,不是改 URL 结构。
  • 两个都用——blog.yoursite.com/post-1yoursite.com/blog/post-1 同时存在是重复内容噩梦。选一个,另一个 301。
  • canonical 混搭——页面在子目录但 canonical 指子域名(或反过来)。内部不一致。
  • 拆子域名时忘 hreflang 等多语言信号——每个子域名可能要各自管 hreflang 配置。

FAQ

  • Google 说哪个更好了吗?: 官方说「都行」。实际上 John Mueller 等搜索工程师暗示过子目录更容易集中信号。多数「从子域名搬到子目录后排名上涨」的案例都讲同一个故事。
  • 把 Medium / Substack 挂子域名呢?: 常见但那些平台占着自己根域名的权威,你受益很少。能自托管就自托管到自己域名的子目录。
  • 能子域名做托管、反代到子目录路径吗?: 能——源站在 blog.yoursite.com,对外通过反代暴露在 yoursite.com/blog,Google 看到的是子目录。
  • 从子域名搬到子目录会短期掉 SEO 吗?: 会短暂——当迷你域名迁移做,配 301。通常 4 到 8 周恢复,常常净增长。
  • 反代多一跳会慢吗?: 几毫秒,基本可忽略。Vercel/Cloudflare/Netlify 边缘都会激进缓存。

相关阅读

标签: #独立开发 #域名 #SEO #Technical SEO #建站策划