给站加一块(博客、文档、帮助中心)有两种 URL 选择:子域名(blog.yoursite.com)或子目录(yoursite.com/blog)。看起来可互换,其实不是——至少 SEO 上不是。下面是决策和两种路径的具体 rewrite 配置。
问题背景
Google 十年前就说过子域名和子目录都能用。实际上子目录把权威集中在一个域名,子域名更像独立站——可能分散你的 SEO 资产。多数独立内容场景子目录是对的。即使博客在另一个仓库,用反代或平台 rewrite 也能把子目录搭起来。
判断标准
- 在已有品牌域名下加博客或文档区。
- 想让一个信任信号下的域名权威更快增长。
- 不同板块没跑在完全独立技术栈上。
- 主站和新区会大量互链。
快速结论
想计入同一 SEO 实体的内容默认子目录(yoursite.com/blog)。技术上隔离、托管在不同平台、或真的独立产品时用子域名(docs.yoursite.com、app.yoursite.com)。
开始前准备
- 知道博客和主站是否同仓库。
- host 支持 rewrite(Vercel、Netlify、Cloudflare Workers、Next.js)。
- canonical 标签按所选结构规划。
实操步骤
-
按目的选,不按基础设施。 同品牌同受众 → 子目录。独立产品或独立栈 → 子域名。
-
同仓库的子目录方案:
/blog路由到博客。Astro:
src/pages/blog/index.astro
src/pages/blog/[...slug].astro
Next.js:
app/blog/page.tsx
app/blog/[slug]/page.tsx
- 博客在不同仓库 / 不同 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/...。
-
子域名方案(确实要分开时):DNS 配子域名指向各自 host,每个 host 自己处理 SSL 和内容。Search Console 子域名加为独立 property。
-
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/" ✓
- 每个 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>
-
主站与该区互链多写一点——这是集中权威的关键。Header、footer、内容里多次出现。
-
验证反代正确穿透:
# 响应头应该像主站,不是上游
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-1和yoursite.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 #建站策划