INDEX PREVENTION SOP
本地来源:seo-llm/SEO/Guideline/INDEX-PREVENTION-SOP.md
防止意外索引操作手册 (Index Prevention SOP)
最后更新: 2026-01-23 重要性: 🚨 极高 - 防止敏感页面、管理后台、草稿被搜索引擎索引
📋 目录
为什么需要防止意外索引
风险场景
❌ 管理后台被索引
- 问题:/admin, /seo 等管理页面出现在搜索结果
- 后果:暴露后台入口,增加安全风险,泄露敏感信息
- 示例:Google 搜索 site:seedvr2.net/admin 返回结果
❌ 草稿文章被索引 - 问题:未完成的博客文章被搜索引擎抓取 - 后果:低质量内容影响网站权重,用户体验差 - 示例:半成品文章出现在搜索结果,点击率低,跳出率高
❌ 认证页面被索引
- 问题:/auth/login, /auth/register 等页面被索引
- 后果:浪费爬取配额,无 SEO 价值
- 示例:登录页面出现在搜索结果,用户点击后无法获取有价值信息
❌ 支付页面被索引
- 问题:/payment 支付流程页面被索引
- 后果:安全风险,用户误入支付页面
- 示例:支付页面直接出现在搜索结果,跳过正常购买流程
❌ API 端点被索引
- 问题:/api/* 路由被搜索引擎抓取
- 后果:浪费服务器资源,可能触发 API 调用
- 示例:API 端点返回 JSON 数据被索引,无意义
正确的索引策略
✅ 应该被索引的页面(280 个 URL)
- 核心页面:/, /pricing, /about, /blog
- 工具页面:/tools/upscaler, /tools/video-upscaler
- 模型页面:/models/flux2, /models/sora2
- 博客文章:/blog/tutorials/*(已发布)
- 法律页面:/privacy, /terms, /refund
❌ 不应该被索引的页面(180+ URL)
- 管理后台:/admin/*, /seo/*
- 认证页面:/auth/*
- 用户设置:/settings/*
- 支付页面:/payment
- 分享页面:/share/*
- API 路由:/api/*
- Next.js 内部:/_next/*
三层防护体系
我们使用三层防护确保敏感页面不被索引:
Layer 1: Robots.txt ← 告诉爬虫"不要来"
↓
Layer 2: Meta Robots 标签 ← 页面级别"不要索引"
↓
Layer 3: Sitemap 过滤 ← 主动告诉搜索引擎"只索引这些"
防护层级说明
| 层级 | 作用范围 | 强度 | 优先级 |
|---|---|---|---|
| Layer 1: Robots.txt | 整个路径或目录 | 建议性 | 低 |
| Layer 2: Meta Robots | 单个页面 | 强制性 | 高 |
| Layer 3: Sitemap | 主动提交 | 引导性 | 中 |
为什么需要三层? - Robots.txt 只是"建议",爬虫可以忽略 - Meta Robots 是"强制",但需要爬虫先访问页面 - Sitemap 是"主动告诉"搜索引擎优先索引哪些页面
三层配合效果: 1. Robots.txt 阻止大部分爬虫访问敏感路径 2. 即使爬虫访问,Meta Robots 标签强制不索引 3. Sitemap 主动引导爬虫索引正确的页面
Robots.txt 配置详解
文件位置
项目根目录
└── public/
└── robots.txt ← 必须在这里
重要: 必须放在 public/ 目录,Next.js 构建后会自动复制到根路径。
完整配置
文件: public/robots.txt
# robots.txt for seedvr2.net
# SeedVR2 (SeedVR 2) - One-Step Video Restoration & Upscaling
User-agent: *
Allow: /
# Disallow crawling of private and technical routes
Disallow: /api/
Disallow: /_next/
Disallow: /dashboard/
Disallow: /settings/
Disallow: /admin/
Disallow: /auth/
Disallow: /seo/
Disallow: /payment
Disallow: /share/
# Sitemap location
Sitemap: https://seedvr2.net/sitemap.xml
# Crawl-delay for polite crawling
Crawl-delay: 1
规则详解
1. User-agent
User-agent: *
*= 所有爬虫- 也可以针对特定爬虫:
User-agent: Googlebot
2. Allow
Allow: /
- 允许爬取网站根目录
- 必须在 Disallow 之前声明
3. Disallow 规则
/api/ - API 路由
Disallow: /api/
为什么: - API 端点返回 JSON 数据,无 SEO 价值 - 避免浪费爬取配额 - 避免触发不必要的 API 调用
覆盖范围:
- /api/auth/*
- /api/seo/*
- /api/payment/*
- 所有 /api/ 下的路由
/_next/ - Next.js 内部文件
Disallow: /_next/
为什么: - Next.js 打包生成的 JS/CSS 文件 - 无内容价值,纯技术文件
/dashboard/ - 用户仪表盘
Disallow: /dashboard/
为什么: - 用户私有数据 - 需要登录才能访问 - 无公开价值
/settings/ - 用户设置
Disallow: /settings/
为什么: - 用户个人设置页面 - 包含敏感信息(账户、安全)
覆盖范围:
- /settings/profile
- /settings/billing
- /settings/security
- /settings/notifications
- /settings/credits
/admin/ - 管理后台
Disallow: /admin/
为什么: - 管理员专用界面 - 包含敏感业务数据 - 安全风险最高
覆盖范围:
- /admin/users
- /admin/orders
- /admin/payments
- /admin/generations
- /admin/ads
- /admin/credits
- /admin/daily
- /admin/uploads
/auth/ - 认证页面
Disallow: /auth/
为什么: - 登录、注册、重置密码页面 - 无 SEO 价值 - 避免浪费爬取配额
覆盖范围:
- /auth/login
- /auth/register
- /auth/forgot-password
- /auth/reset-password
- /auth/error
- /auth/post-oauth
/seo/ - SEO 管理后台 ⚠️ 最重要
Disallow: /seo/
为什么: - SEO 内容管理后台 - 包含未发布草稿 - 包含内部编辑工具 - 不加这条会导致整个 SEO 后台被索引
覆盖范围:
- /seo - 仪表盘
- /seo/blogs - 博客列表
- /seo/blog/new - 创建文章
- /seo/drafts - 草稿管理
- /seo/images - 图片管理
- /seo/prompts - 提示词管理
- /seo/search - 搜索功能
- /seo/templates - 模板管理
- /seo/settings - 设置
- /seo/videos - 视频管理
- /seo/data - 数据管理
真实案例:
# 如果没有这条规则:
Google: site:seedvr2.net/seo
# 结果:暴露整个 SEO 管理后台的所有页面
# 加上规则后:
Google: site:seedvr2.net/seo
# 结果:无结果(正确)
/payment - 支付页面
Disallow: /payment
注意: 路径末尾没有 /
为什么:
- 支付流程页面
- 包含敏感支付信息
- 用户应该通过 /pricing 进入,而非直接访问
/share/ - 临时分享链接
Disallow: /share/
为什么:
- 动态生成的临时分享链接
- 格式:/share/[random-id]
- 无 SEO 价值,时效性短
4. Sitemap 声明
Sitemap: https://seedvr2.net/sitemap.xml
重要: - 主动告诉搜索引擎 sitemap 位置 - 加速索引发现 - 必须使用完整 URL(包含 https://)
5. Crawl-delay(可选)
Crawl-delay: 1
作用: - 爬虫在请求之间等待 1 秒 - 减轻服务器压力 - Googlebot 会忽略此指令
Meta Robots 标签详解
什么是 Meta Robots 标签
在 HTML <head> 中的 meta 标签,直接告诉搜索引擎如何处理当前页面:
<meta name="robots" content="noindex, nofollow" />
常用指令
| 指令 | 作用 |
|---|---|
index |
允许索引(默认) |
noindex |
禁止索引 |
follow |
允许跟踪链接(默认) |
nofollow |
禁止跟踪链接 |
noarchive |
禁止缓存页面 |
nosnippet |
禁止显示摘要 |
组合用法
<!-- 最严格:不索引,不跟踪链接 -->
<meta name="robots" content="noindex, nofollow" />
<!-- 不索引,但可以跟踪链接 -->
<meta name="robots" content="noindex, follow" />
<!-- 允许索引,但不缓存 -->
<meta name="robots" content="index, follow, noarchive" />
Next.js 实现方式
方法 1: Metadata API(推荐)
文件: src/app/[locale]/(protected)/admin/layout.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
robots: {
index: false, // noindex
follow: false, // nofollow
nocache: true, // 不缓存
googleBot: {
index: false,
follow: false,
},
},
}
export default function AdminLayout({
children,
}: {
children: React.ReactNode
}) {
return <>{children}</>
}
生成的 HTML:
<meta name="robots" content="noindex, nofollow, nocache" />
<meta name="googlebot" content="noindex, nofollow" />
方法 2: 动态 Metadata
文件: src/app/[locale]/(protected)/admin/page.tsx
import type { Metadata } from 'next'
export async function generateMetadata(): Promise<Metadata> {
return {
title: 'Admin Dashboard',
robots: {
index: false,
follow: false,
},
}
}
export default function AdminPage() {
return <div>Admin Dashboard</div>
}
需要 noindex 的所有路由
1. /admin/* - 管理后台
文件: src/app/[locale]/(protected)/admin/layout.tsx
export const metadata: Metadata = {
robots: {
index: false,
follow: false,
},
}
影响页面:
- /admin - 仪表盘
- /admin/users - 用户管理
- /admin/orders - 订单管理
- /admin/payments - 支付记录
- /admin/generations - 生成记录
- /admin/ads - 广告归因
- /admin/credits - 积分管理
- /admin/daily - 每日统计
- /admin/uploads - 上传管理
2. /auth/* - 认证页面
文件: src/app/[locale]/auth/layout.tsx (如果有)
或在每个页面单独设置:
文件: src/app/[locale]/auth/login/page.tsx
export const metadata: Metadata = {
title: 'Login - SeedVR2',
robots: {
index: false,
follow: false,
},
}
影响页面:
- /auth/login
- /auth/register
- /auth/forgot-password
- /auth/reset-password
- /auth/error
- /auth/post-oauth
3. /settings/* - 用户设置
文件: src/app/[locale]/(protected)/settings/layout.tsx
export const metadata: Metadata = {
robots: {
index: false,
follow: false,
},
}
影响页面:
- /settings/profile
- /settings/billing
- /settings/security
- /settings/notifications
- /settings/credits
4. /seo/* - SEO 管理后台 ⚠️ 必须
文件: src/app/[locale]/(protected)/seo/layout.tsx
export const metadata: Metadata = {
title: 'SEO Management',
robots: {
index: false,
follow: false,
nocache: true,
},
}
影响页面:
- /seo - 仪表盘
- /seo/blogs - 博客列表
- /seo/blog/new - 创建文章
- /seo/drafts - 草稿管理
- /seo/images - 图片管理
- /seo/prompts - 提示词
- /seo/search - 搜索
- /seo/templates - 模板
- /seo/settings - 设置
- /seo/videos - 视频
- /seo/data - 数据
5. /payment - 支付页面
文件: src/app/[locale]/(protected)/payment/page.tsx
export const metadata: Metadata = {
title: 'Payment',
robots: {
index: false,
follow: false,
},
}
6. /share/[id] - 分享页面
文件: src/app/[locale]/(protected)/share/[id]/page.tsx
export const metadata: Metadata = {
robots: {
index: false,
follow: true, // 允许跟踪链接(因为可能包含有价值的链接)
},
}
Sitemap 过滤详解
Sitemap 的作用
Sitemap 是主动告诉搜索引擎: - 哪些页面应该被索引 - 页面的优先级 - 页面的更新频率 - 最后修改时间
Next.js Sitemap 配置
文件: src/app/sitemap.ts
import { blogSource } from '@/lib/source'
import type { MetadataRoute } from 'next'
const baseUrl = 'https://seedvr2.net'
// 支持的语言
const locales = ['en', 'zh', 'es', 'ja', 'ko']
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
// 静态路由(手动定义)
const staticRoutes = [
'', // 首页
'/pricing',
'/about',
'/blog',
'/support',
'/creations',
'/privacy',
'/terms',
'/refund',
// ... 工具和模型页面
]
// 为每个语言生成静态路由
const staticUrls = locales.flatMap((locale) =>
staticRoutes.map((route) => ({
url: `${baseUrl}${locale === 'en' ? '' : `/${locale}`}${route}`,
lastModified: new Date(),
changeFrequency: 'weekly' as const,
priority: route === '' ? 1.0 : 0.9,
}))
)
// 动态博客路由(从 MDX 文件读取)
const blogPages = await blogSource.getPages()
// ⚠️ 关键过滤:只包含已发布的文章
const publishedBlogPages = blogPages.filter(
(page) => page.data.published === true
)
const blogUrls = locales.flatMap((locale) =>
publishedBlogPages.map((page) => ({
url: `${baseUrl}${locale === 'en' ? '' : `/${locale}`}/blog/${page.url}`,
lastModified: page.data.updatedAt || page.data.publishedAt || new Date(),
changeFrequency: 'monthly' as const,
priority: 0.8,
}))
)
return [...staticUrls, ...blogUrls]
}
关键过滤逻辑
1. 过滤未发布博客
const publishedBlogPages = blogPages.filter(
(page) => page.data.published === true
)
作用:
- 只有 published: true 的文章才会出现在 sitemap
- 草稿(published: false)自动排除
Frontmatter 示例:
# 已发布文章 ✅
---
title: "SeedVR2 Ultimate Guide"
published: true # 会出现在 sitemap
publishedAt: "2026-01-23"
---
# 草稿文章 ❌
---
title: "Unfinished Article"
published: false # 不会出现在 sitemap
publishedAt: null
---
2. 排除特定路由
Sitemap 不应该包含的路由(通过不添加来排除):
/admin/*- 不添加/auth/*- 不添加/settings/*- 不添加/seo/*- 不添加/payment- 不添加/share/*- 不添加/api/*- 不添加
实现方式: 只在 staticRoutes 数组中添加应该被索引的路由。
3. 多语言处理
const locales = ['en', 'zh', 'es', 'ja', 'ko']
const staticUrls = locales.flatMap((locale) =>
staticRoutes.map((route) => ({
url: `${baseUrl}${locale === 'en' ? '' : `/${locale}`}${route}`,
// ...
}))
)
生成结果:
<url>
<loc>https://seedvr2.net/pricing</loc> <!-- 英文 -->
</url>
<url>
<loc>https://seedvr2.net/zh/pricing</loc> <!-- 中文 -->
</url>
<url>
<loc>https://seedvr2.net/es/pricing</loc> <!-- 西班牙语 -->
</url>
验证 Sitemap
1. 本地验证
# 构建项目
pnpm build
# 启动生产服务器
pnpm start
# 访问 sitemap
curl http://localhost:3000/sitemap.xml | head -n 50
2. 线上验证
curl https://seedvr2.net/sitemap.xml | grep -c "<url>"
# 应该返回 280 左右(取决于博客数量)
# 检查是否包含不应该有的路由
curl https://seedvr2.net/sitemap.xml | grep "/admin"
# 应该无结果
curl https://seedvr2.net/sitemap.xml | grep "/seo/"
# 应该无结果
3. 使用 Google Search Console
- 登录 GSC: https://search.google.com/search-console
- 选择属性 → 站点地图
- 提交
https://seedvr2.net/sitemap.xml - 查看"已发现的 URL 数量"
- 查看错误报告
各类页面防护策略
策略矩阵
| 页面类型 | Robots.txt | Meta Robots | Sitemap | 说明 |
|---|---|---|---|---|
核心页面 (/, /pricing) |
✅ Allow | ✅ index | ✅ 包含 | 全力推广 |
| 博客文章 (已发布) | ✅ Allow | ✅ index | ✅ 包含 | SEO 重点 |
| 博客草稿 | ✅ Allow | ❌ noindex | ❌ 排除 | 通过 published: false 过滤 |
管理后台 (/admin/*) |
❌ Disallow | ❌ noindex | ❌ 排除 | 三层防护 |
SEO 后台 (/seo/*) |
❌ Disallow | ❌ noindex | ❌ 排除 | 三层防护 |
认证页面 (/auth/*) |
❌ Disallow | ❌ noindex | ❌ 排除 | 无 SEO 价值 |
用户设置 (/settings/*) |
❌ Disallow | ❌ noindex | ❌ 排除 | 私有数据 |
支付页面 (/payment) |
❌ Disallow | ❌ noindex | ❌ 排除 | 安全考虑 |
分享页面 (/share/*) |
❌ Disallow | ❌ noindex | ❌ 排除 | 临时链接 |
API 路由 (/api/*) |
❌ Disallow | N/A | ❌ 排除 | 技术端点 |
实施清单
核心页面(允许索引)
- [x]
public/robots.txt→Allow: / - [x] 页面 metadata →
robots: { index: true, follow: true } - [x]
src/app/sitemap.ts→ 添加到staticRoutes
博客文章(条件索引)
- [x]
public/robots.txt→Allow: /blog - [x] 已发布文章 →
published: true - [x] 草稿文章 →
published: false - [x]
src/app/sitemap.ts→ 过滤published === true
管理后台(严格禁止)
- [x]
public/robots.txt→Disallow: /admin/ - [x] Layout metadata →
robots: { index: false, follow: false } - [x] Sitemap → 不添加
/admin/*路由
SEO 后台(严格禁止) ⚠️
- [x]
public/robots.txt→Disallow: /seo/ - [x] Layout metadata →
robots: { index: false, follow: false } - [x] Sitemap → 不添加
/seo/*路由
其他敏感页面
按照同样的三层防护策略配置。
验证和测试
1. Robots.txt 验证
方法 A: 浏览器直接访问
https://seedvr2.net/robots.txt
检查项: - [ ] 文件能正常访问(HTTP 200) - [ ] 包含所有 Disallow 规则 - [ ] Sitemap 指向正确
方法 B: Google Robots Tester
- 登录 GSC: https://search.google.com/search-console
- 设置 → robots.txt 测试工具
- 输入 URL 进行测试
测试用例:
测试 URL: https://seedvr2.net/admin
预期结果: ❌ Blocked by robots.txt
测试 URL: https://seedvr2.net/seo/blogs
预期结果: ❌ Blocked by robots.txt
测试 URL: https://seedvr2.net/blog/tutorials/seedvr2-guide
预期结果: ✅ Allowed
方法 C: 命令行验证
# 检查特定路径是否被 Disallow
curl https://seedvr2.net/robots.txt | grep "/seo/"
# 应该返回: Disallow: /seo/
# 运行验证脚本
./scripts/check-robots-compliance.sh
2. Meta Robots 标签验证
方法 A: 查看页面源代码
# 访问页面
https://seedvr2.net/admin
# 查看源代码 (Ctrl+U / Cmd+Option+U)
# 搜索: <meta name="robots"
# 应该看到:
<meta name="robots" content="noindex, nofollow" />
方法 B: 使用 curl
# 检查 admin 页面
curl -s https://seedvr2.net/admin | grep -i "robots"
# 应该输出:
<meta name="robots" content="noindex, nofollow"/>
# 检查 SEO 后台
curl -s https://seedvr2.net/seo | grep -i "robots"
# 应该输出:
<meta name="robots" content="noindex, nofollow"/>
方法 C: 使用浏览器开发者工具
- 访问
https://seedvr2.net/admin - 打开开发者工具 (F12)
- Elements 标签 → 查看
<head>部分 - 确认存在
<meta name="robots" content="noindex, nofollow">
3. Sitemap 验证
验证 Sitemap 不包含敏感路由
# 下载 sitemap
curl https://seedvr2.net/sitemap.xml > sitemap.xml
# 检查是否包含 /admin(应该无结果)
grep "/admin" sitemap.xml
# 输出: (空)
# 检查是否包含 /seo/(应该无结果)
grep "/seo/" sitemap.xml
# 输出: (空)
# 检查是否包含 /auth/(应该无结果)
grep "/auth/" sitemap.xml
# 输出: (空)
# 检查包含的 URL 数量
grep -c "<url>" sitemap.xml
# 应该约 280 个
验证只包含已发布博客
# 检查 sitemap 中的博客 URL
curl https://seedvr2.net/sitemap.xml | grep "/blog/tutorials"
# 对比实际发布的博客
ls content/blog/tutorials/*.mdx | wc -l
# 数量应该匹配(×5 语言)
4. 索引状态验证
Google 验证(1-2 周后)
# 检查特定 URL 是否被索引
site:seedvr2.net/admin
# 预期结果: 无结果
site:seedvr2.net/seo/blogs
# 预期结果: 无结果
site:seedvr2.net/blog/tutorials/seedvr2-guide
# 预期结果: 有结果
GSC 验证
- 登录 GSC → 覆盖率
- 查看"已排除"部分
- 确认敏感页面在"已被 robots.txt 屏蔽"列表中
5. 完整验证脚本
创建验证脚本 scripts/verify-index-prevention.sh:
#!/bin/bash
# 验证索引防护配置
echo "🔍 验证索引防护配置"
echo "================================"
# 1. 验证 robots.txt
echo ""
echo "1️⃣ 验证 robots.txt"
if curl -s https://seedvr2.net/robots.txt | grep -q "Disallow: /seo/"; then
echo "✅ robots.txt 包含 /seo/ 规则"
else
echo "❌ robots.txt 缺少 /seo/ 规则"
fi
# 2. 验证 Meta Robots
echo ""
echo "2️⃣ 验证 Meta Robots 标签"
if curl -s https://seedvr2.net/admin | grep -q "noindex"; then
echo "✅ /admin 包含 noindex"
else
echo "❌ /admin 缺少 noindex"
fi
if curl -s https://seedvr2.net/seo | grep -q "noindex"; then
echo "✅ /seo 包含 noindex"
else
echo "❌ /seo 缺少 noindex"
fi
# 3. 验证 Sitemap
echo ""
echo "3️⃣ 验证 Sitemap"
if ! curl -s https://seedvr2.net/sitemap.xml | grep -q "/admin"; then
echo "✅ sitemap 不包含 /admin"
else
echo "❌ sitemap 包含 /admin(错误)"
fi
if ! curl -s https://seedvr2.net/sitemap.xml | grep -q "/seo/"; then
echo "✅ sitemap 不包含 /seo/"
else
echo "❌ sitemap 包含 /seo/(错误)"
fi
echo ""
echo "================================"
echo "验证完成!"
运行验证:
chmod +x scripts/verify-index-prevention.sh
./scripts/verify-index-prevention.sh
常见错误和修复
错误 1: /seo 后台被索引
症状:
site:seedvr2.net/seo
# 返回结果:/seo, /seo/blogs, /seo/drafts 等
原因:
- [ ] robots.txt 缺少 Disallow: /seo/
- [ ] /seo Layout 缺少 noindex metadata
- [ ] Sitemap 错误地包含了 /seo 路由
修复步骤:
- 检查
public/robots.txt:
Disallow: /seo/ ← 确认存在
- 检查
src/app/[locale]/(protected)/seo/layout.tsx:
export const metadata = {
robots: {
index: false,
follow: false,
},
}
-
检查
src/app/sitemap.ts不包含/seo路由 -
请求 Google 移除: - GSC → 移除 → 临时移除 - 输入 URL:
https://seedvr2.net/seo
错误 2: 草稿文章被索引
症状:
site:seedvr2.net/blog/unfinished-article
# 返回结果:未完成的草稿文章
原因:
- Frontmatter 中 published: true(应该是 false)
- Sitemap 过滤逻辑错误
修复步骤:
- 修改 Frontmatter:
---
title: "Unfinished Article"
published: false # ← 改为 false
---
- 重新构建:
pnpm build
- 验证 sitemap 不包含该文章:
curl https://seedvr2.net/sitemap.xml | grep "unfinished-article"
# 应该无结果
- 请求 Google 移除(如果已索引)
错误 3: Robots.txt 拼写错误
症状:
curl https://seedvr2.net/robots.txt
# HTTP 404 Not Found
原因:
- 文件名拼写错误:robot.txt 而非 robots.txt
- 文件位置错误:不在 public/ 目录
修复步骤:
- 确认文件路径:
ls -la public/robots.txt
# 应该存在
-
确认文件名正确(复数
robots) -
重新部署
错误 4: Meta Robots 被覆盖
症状: - Layout 设置了 noindex - 但页面级别设置了 index - 页面最终被索引
原因: - 页面级别 metadata 覆盖了 Layout metadata
修复步骤:
- 检查页面文件
page.tsx:
// ❌ 错误:覆盖了 Layout 的 noindex
export const metadata = {
robots: {
index: true, // ← 删除这行
},
}
- 只在 Layout 设置 robots metadata:
// src/app/[locale]/(protected)/admin/layout.tsx
export const metadata = {
robots: {
index: false,
follow: false,
},
}
错误 5: 动态路由未设置 noindex
症状:
site:seedvr2.net/share/abc123
# 返回结果:分享页面被索引
原因:
- 动态路由 [id] 未设置 noindex
修复步骤:
- 在动态路由页面设置:
// src/app/[locale]/(protected)/share/[id]/page.tsx
export const metadata = {
robots: {
index: false,
follow: true,
},
}
- 或在 Layout 统一设置:
// src/app/[locale]/(protected)/share/layout.tsx
export const metadata = {
robots: {
index: false,
follow: true,
},
}
紧急情况处理
场景 1: 敏感页面已被索引
发现方式:
site:seedvr2.net/admin
# 结果:返回多个 admin 页面
立即操作:
- 确认配置正确 (5 分钟) ```bash # 检查 robots.txt curl https://seedvr2.net/robots.txt | grep "/admin" # 应该有: Disallow: /admin/
# 检查 meta robots curl -s https://seedvr2.net/admin | grep "noindex" # 应该有: <meta name="robots" content="noindex, nofollow"/> ```
-
请求 Google 紧急移除 (10 分钟) - 登录 GSC - 左侧菜单 → 移除 - 点击"新请求" - 选择"临时移除 URL" - 输入:
https://seedvr2.net/admin- 提交请求 - 生效时间: 1 天内 -
批量移除子路径 (10 分钟) - 如果有多个子路径被索引 - 使用通配符:
https://seedvr2.net/admin/*- 可以一次性移除整个目录 -
长期解决 (1-2 周) - 等待 Google 重新爬取 - 看到 noindex 后自动移除 - 在 GSC "覆盖率" 中确认"已排除"
场景 2: 大量草稿被索引
发现方式:
site:seedvr2.net/blog
# 结果:包含未发布的草稿文章
立即操作:
- 批量修改 Frontmatter (15 分钟) ```bash # 查找所有草稿文件 grep -l "published: true" content/blog/*/.mdx
# 批量替换为 false(需要确认) # 手动修改,避免误操作 ```
-
重新构建和部署 (10 分钟)
bash pnpm build git add . git commit -m "fix: set draft articles to unpublished" git push origin main -
验证 Sitemap (5 分钟)
bash curl https://seedvr2.net/sitemap.xml | grep "draft" # 应该无结果 -
请求移除已索引的草稿 (20 分钟) - 逐个提交移除请求 - 或等待自然去索引(1-2 周)
场景 3: Robots.txt 配置错误导致全站被阻止
症状:
# 错误配置
User-agent: *
Disallow: /
后果: - 整个网站被阻止爬取 - 流量暴跌
紧急修复 (5 分钟):
- 立即修改 robots.txt: ```txt User-agent: * Allow: / # ← 修复为 Allow
Disallow: /api/ Disallow: /admin/ # ... 其他规则 ```
-
部署修复:
bash git add public/robots.txt git commit -m "fix: correct robots.txt Allow rule" git push origin main -
通知 Google (10 分钟): - GSC → 设置 → robots.txt 测试工具 - 输入修复后的 robots.txt - 点击"提交到 Google"
-
重新提交 Sitemap (5 分钟): - GSC → 站点地图 - 删除旧 sitemap - 重新提交
https://seedvr2.net/sitemap.xml -
监控恢复 (1-3 天): - GSC → 效果报告 - 观察展示次数和点击次数 - 应该在 1-3 天内恢复
检查清单总结
新项目设置清单
- [ ] 1. 创建
public/robots.txt并配置所有 Disallow 规则 - [ ] 2. 在所有敏感路由的 Layout 中设置
robots: { index: false } - [ ] 3. 配置
src/app/sitemap.ts过滤逻辑 - [ ] 4. 博客 Frontmatter 模板包含
published字段 - [ ] 5. 运行验证脚本
./scripts/verify-index-prevention.sh - [ ] 6. 提交 sitemap 到 GSC 和 Bing
- [ ] 7. 使用 Google Robots Tester 测试所有敏感路径
- [ ] 8. 1 周后检查
site:命令确认无敏感页面被索引
每次发布新内容清单
- [ ] 1. 确认
published: true/false设置正确 - [ ] 2. 构建项目
pnpm build无错误 - [ ] 3. 检查 sitemap.xml 包含/排除正确
- [ ] 4. 检查 robots.txt 允许爬取该路径
- [ ] 5. 检查页面 meta robots 标签正确
- [ ] 6. 提交到搜索引擎索引
每周维护清单
- [ ] 1. 检查 GSC "覆盖率" 报告
- [ ] 2. 确认无敏感页面在"有效"列表
- [ ] 3. 确认敏感页面在"已排除"列表
- [ ] 4. 运行
site:命令抽查敏感路径 - [ ] 5. 检查新增路由是否正确配置
版本: v1.0 最后更新: 2026-01-23 紧急联系: SEO Team
本文档为站内渲染。原始文件本地路径:saas/source/seo-llm/SEO-Guideline-INDEX-PREVENTION-SOP-fb23e2.md(仅本地保留,不入库不部署)