INDEX PREVENTION SOP.md
本地来源:seo-llm/raw/seo知识库/TXT整理/seo方法论/seo-knowledge-base/INDEX-PREVENTION-SOP.md.txt
# 防止意外索引操作手册 (Index Prevention SOP)
**最后更新**: 2026-01-23
**重要性**: 🚨 **极高** - 防止敏感页面、管理后台、草稿被搜索引擎索引
---
## 📋 目录
1. [为什么需要防止意外索引](#为什么需要防止意外索引)
2. [三层防护体系](#三层防护体系)
3. [Robots.txt 配置详解](#robotstxt-配置详解)
4. [Meta Robots 标签详解](#meta-robots-标签详解)
5. [Sitemap 过滤详解](#sitemap-过滤详解)
6. [各类页面防护策略](#各类页面防护策略)
7. [验证和测试](#验证和测试)
8. [常见错误和修复](#常见错误和修复)
9. [紧急情况处理](#紧急情况处理)
---
## 为什么需要防止意外索引
### 风险场景
❌ **管理后台被索引**
- 问题:`/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`
```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
```txt
User-agent: *
```
- `*` = 所有爬虫
- 也可以针对特定爬虫:`User-agent: Googlebot`
#### 2. Allow
```txt
Allow: /
```
- 允许爬取网站根目录
- 必须在 Disallow 之前声明
#### 3. Disallow 规则
##### `/api/` - API 路由
```txt
Disallow: /api/
```
**为什么**:
- API 端点返回 JSON 数据,无 SEO 价值
- 避免浪费爬取配额
- 避免触发不必要的 API 调用
**覆盖范围**:
- `/api/auth/*`
- `/api/seo/*`
- `/api/payment/*`
- 所有 `/api/` 下的路由
##### `/_next/` - Next.js 内部文件
```txt
Disallow: /_next/
```
**为什么**:
- Next.js 打包生成的 JS/CSS 文件
- 无内容价值,纯技术文件
##### `/dashboard/` - 用户仪表盘
```txt
Disallow: /dashboard/
```
**为什么**:
- 用户私有数据
- 需要登录才能访问
- 无公开价值
##### `/settings/` - 用户设置
```txt
Disallow: /settings/
```
**为什么**:
- 用户个人设置页面
- 包含敏感信息(账户、安全)
**覆盖范围**:
- `/settings/profile`
- `/settings/billing`
- `/settings/security`
- `/settings/notifications`
- `/settings/credits`
##### `/admin/` - 管理后台
```txt
Disallow: /admin/
```
**为什么**:
- 管理员专用界面
- 包含敏感业务数据
- 安全风险最高
**覆盖范围**:
- `/admin/users`
- `/admin/orders`
- `/admin/payments`
- `/admin/generations`
- `/admin/ads`
- `/admin/credits`
- `/admin/daily`
- `/admin/uploads`
##### `/auth/` - 认证页面
```txt
Disallow: /auth/
```
**为什么**:
- 登录、注册、重置密码页面
- 无 SEO 价值
- 避免浪费爬取配额
**覆盖范围**:
- `/auth/login`
- `/auth/register`
- `/auth/forgot-password`
- `/auth/reset-password`
- `/auth/error`
- `/auth/post-oauth`
##### `/seo/` - SEO 管理后台 ⚠️ **最重要**
```txt
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` - 数据管理
**真实案例**:
```bash
# 如果没有这条规则:
Google: site:seedvr2.net/seo
# 结果:暴露整个 SEO 管理后台的所有页面
# 加上规则后:
Google: site:seedvr2.net/seo
# 结果:无结果(正确)
```
##### `/payment` - 支付页面
```txt
Disallow: /payment
```
**注意**: 路径末尾**没有 `/`**
**为什么**:
- 支付流程页面
- 包含敏感支付信息
- 用户应该通过 `/pricing` 进入,而非直接访问
##### `/share/` - 临时分享链接
```txt
Disallow: /share/
```
**为什么**:
- 动态生成的临时分享链接
- 格式:`/share/[random-id]`
- 无 SEO 价值,时效性短
#### 4. Sitemap 声明
```txt
Sitemap: https://seedvr2.net/sitemap.xml
```
**重要**:
- 主动告诉搜索引擎 sitemap 位置
- 加速索引发现
- 必须使用完整 URL(包含 https://)
#### 5. Crawl-delay(可选)
```txt
Crawl-delay: 1
```
**作用**:
- 爬虫在请求之间等待 1 秒
- 减轻服务器压力
- Googlebot 会忽略此指令
---
## Meta Robots 标签详解
### 什么是 Meta Robots 标签
在 HTML `<head>` 中的 meta 标签,直接告诉搜索引擎如何处理当前页面:
```html
<meta name="robots" content="noindex, nofollow" />
```
### 常用指令
| 指令 | 作用 |
| ----------- | -------------------- |
| `index` | 允许索引(默认) |
| `noindex` | **禁止索引** |
| `follow` | 允许跟踪链接(默认) |
| `nofollow` | 禁止跟踪链接 |
| `noarchive` | 禁止缓存页面 |
| `nosnippet` | 禁止显示摘要 |
### 组合用法
```html
<!-- 最严格:不索引,不跟踪链接 -->
<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`
```typescript
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**:
```html
<meta name="robots" content="noindex, nofollow, nocache" />
<meta name="googlebot" content="noindex, nofollow" />
```
#### 方法 2: 动态 Metadata
**文件**: `src/app/[locale]/(protected)/admin/page.tsx`
```typescript
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`
```typescript
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`
```typescript
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`
```typescript
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`
```typescript
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`
```typescript
export const metadata: Metadata = {
title: 'Payment',
robots: {
index: false,
follow: false,
},
};
```
#### 6. `/share/[id]` - 分享页面
**文件**: `src/app/[locale]/(protected)/share/[id]/page.tsx`
```typescript
export const metadata: Metadata = {
robots: {
index: false,
follow: true, // 允许跟踪链接(因为可能包含有价值的链接)
},
};
```
---
## Sitemap 过滤详解
### Sitemap 的作用
Sitemap 是主动告诉搜索引擎:
- 哪些页面应该被索引
- 页面的优先级
- 页面的更新频率
- 最后修改时间
### Next.js Sitemap 配置
**文件**: `src/app/sitemap.ts`
```typescript
import type { MetadataRoute } from 'next';
import { blogSource } from '@/lib/source';
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. 过滤未发布博客
```typescript
const publishedBlogPages = blogPages.filter(
(page) => page.data.published === true
);
```
**作用**:
- 只有 `published: true` 的文章才会出现在 sitemap
- 草稿(`published: false`)自动排除
**Frontmatter 示例**:
```yaml
# 已发布文章 ✅
---
title: 'SeedVR2 Ultimate Guide'
published: true # 会出现在 sitemap
publishedAt: '2026-01-23'
---
```
```yaml
# 草稿文章 ❌
---
title: 'Unfinished Article'
published: false # 不会出现在 sitemap
publishedAt: null
---
```
#### 2. 排除特定路由
Sitemap **不应该包含**的路由(通过不添加来排除):
- `/admin/*` - 不添加
- `/auth/*` - 不添加
- `/settings/*` - 不添加
- `/seo/*` - 不添加
- `/payment` - 不添加
- `/share/*` - 不添加
- `/api/*` - 不添加
**实现方式**: 只在 `staticRoutes` 数组中添加应该被索引的路由。
#### 3. 多语言处理
```typescript
const locales = ['en', 'zh', 'es', 'ja', 'ko'];
const staticUrls = locales.flatMap((locale) =>
staticRoutes.map((route) => ({
url: `${baseUrl}${locale === 'en' ? '' : `/${locale}`}${route}`,
// ...
}))
);
```
**生成结果**:
```xml
<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. 本地验证
```bash
# 构建项目
pnpm build
# 启动生产服务器
pnpm start
# 访问 sitemap
curl http://localhost:3000/sitemap.xml | head -n 50
```
#### 2. 线上验证
```bash
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
1. 登录 GSC: https://search.google.com/search-console
2. 选择属性 → 站点地图
3. 提交 `https://seedvr2.net/sitemap.xml`
4. 查看"已发现的 URL 数量"
5. 查看错误报告
---
## 各类页面防护策略
### 策略矩阵
| 页面类型 | 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
1. 登录 GSC: https://search.google.com/search-console
2. 设置 → robots.txt 测试工具
3. 输入 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: 命令行验证
```bash
# 检查特定路径是否被 Disallow
curl https://seedvr2.net/robots.txt | grep "/seo/"
# 应该返回: Disallow: /seo/
# 运行验证脚本
./scripts/check-robots-compliance.sh
```
### 2. Meta Robots 标签验证
#### 方法 A: 查看页面源代码
```bash
# 访问页面
https://seedvr2.net/admin
# 查看源代码 (Ctrl+U / Cmd+Option+U)
# 搜索: <meta name="robots"
# 应该看到:
<meta name="robots" content="noindex, nofollow" />
```
#### 方法 B: 使用 curl
```bash
# 检查 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: 使用浏览器开发者工具
1. 访问 `https://seedvr2.net/admin`
2. 打开开发者工具 (F12)
3. Elements 标签 → 查看 `<head>` 部分
4. 确认存在 `<meta name="robots" content="noindex, nofollow">`
### 3. Sitemap 验证
#### 验证 Sitemap 不包含敏感路由
```bash
# 下载 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 个
```
#### 验证只包含已发布博客
```bash
# 检查 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 验证
1. 登录 GSC → 覆盖率
2. 查看"已排除"部分
3. 确认敏感页面在"已被 robots.txt 屏蔽"列表中
### 5. 完整验证脚本
创建验证脚本 `scripts/verify-index-prevention.sh`:
```bash
#!/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 "验证完成!"
```
运行验证:
```bash
chmod +x scripts/verify-index-prevention.sh
./scripts/verify-index-prevention.sh
```
---
## 常见错误和修复
### 错误 1: `/seo` 后台被索引
**症状**:
```bash
site:seedvr2.net/seo
# 返回结果:/seo, /seo/blogs, /seo/drafts 等
```
**原因**:
- [ ] `robots.txt` 缺少 `Disallow: /seo/`
- [ ] `/seo` Layout 缺少 noindex metadata
- [ ] Sitemap 错误地包含了 /seo 路由
**修复步骤**:
1. 检查 `public/robots.txt`:
```txt
Disallow: /seo/ ← 确认存在
```
2. 检查 `src/app/[locale]/(protected)/seo/layout.tsx`:
```typescript
export const metadata = {
robots: {
index: false,
follow: false,
},
};
```
3. 检查 `src/app/sitemap.ts` 不包含 `/seo` 路由
4. 请求 Google 移除:
- GSC → 移除 → 临时移除
- 输入 URL: `https://seedvr2.net/seo`
### 错误 2: 草稿文章被索引
**症状**:
```bash
site:seedvr2.net/blog/unfinished-article
# 返回结果:未完成的草稿文章
```
**原因**:
- Frontmatter 中 `published: true`(应该是 `false`)
- Sitemap 过滤逻辑错误
**修复步骤**:
1. 修改 Frontmatter:
```yaml
---
title: 'Unfinished Article'
published: false # ← 改为 false
---
```
2. 重新构建:
```bash
pnpm build
```
3. 验证 sitemap 不包含该文章:
```bash
curl https://seedvr2.net/sitemap.xml | grep "unfinished-article"
# 应该无结果
```
4. 请求 Google 移除(如果已索引)
### 错误 3: Robots.txt 拼写错误
**症状**:
```bash
curl https://seedvr2.net/robots.txt
# HTTP 404 Not Found
```
**原因**:
- 文件名拼写错误:`robot.txt` 而非 `robots.txt`
- 文件位置错误:不在 `public/` 目录
**修复步骤**:
1. 确认文件路径:
```bash
ls -la public/robots.txt
# 应该存在
```
2. 确认文件名正确(复数 `robots`)
3. 重新部署
### 错误 4: Meta Robots 被覆盖
**症状**:
- Layout 设置了 noindex
- 但页面级别设置了 index
- 页面最终被索引
**原因**:
- 页面级别 metadata 覆盖了 Layout metadata
**修复步骤**:
1. 检查页面文件 `page.tsx`:
```typescript
// ❌ 错误:覆盖了 Layout 的 noindex
export const metadata = {
robots: {
index: true, // ← 删除这行
},
};
```
2. 只在 Layout 设置 robots metadata:
```typescript
// src/app/[locale]/(protected)/admin/layout.tsx
export const metadata = {
robots: {
index: false,
follow: false,
},
};
```
### 错误 5: 动态路由未设置 noindex
**症状**:
```bash
site:seedvr2.net/share/abc123
# 返回结果:分享页面被索引
```
**原因**:
- 动态路由 `[id]` 未设置 noindex
**修复步骤**:
1. 在动态路由页面设置:
```typescript
// src/app/[locale]/(protected)/share/[id]/page.tsx
export const metadata = {
robots: {
index: false,
follow: true,
},
};
```
2. 或在 Layout 统一设置:
```typescript
// src/app/[locale]/(protected)/share/layout.tsx
export const metadata = {
robots: {
index: false,
follow: true,
},
};
```
---
## 紧急情况处理
### 场景 1: 敏感页面已被索引
**发现方式**:
```bash
site:seedvr2.net/admin
# 结果:返回多个 admin 页面
```
**立即操作**:
1. **确认配置正确** (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"/>
```
2. **请求 Google 紧急移除** (10 分钟)
- 登录 GSC
- 左侧菜单 → 移除
- 点击"新请求"
- 选择"临时移除 URL"
- 输入: `https://seedvr2.net/admin`
- 提交请求
- **生效时间**: 1 天内
3. **批量移除子路径** (10 分钟)
- 如果有多个子路径被索引
- 使用通配符: `https://seedvr2.net/admin/*`
- 可以一次性移除整个目录
4. **长期解决** (1-2 周)
- 等待 Google 重新爬取
- 看到 noindex 后自动移除
- 在 GSC "覆盖率" 中确认"已排除"
### 场景 2: 大量草稿被索引
**发现方式**:
```bash
site:seedvr2.net/blog
# 结果:包含未发布的草稿文章
```
**立即操作**:
1. **批量修改 Frontmatter** (15 分钟)
```bash
# 查找所有草稿文件
grep -l "published: true" content/blog/**/*.mdx
# 批量替换为 false(需要确认)
# 手动修改,避免误操作
```
2. **重新构建和部署** (10 分钟)
```bash
pnpm build
git add .
git commit -m "fix: set draft articles to unpublished"
git push origin main
```
3. **验证 Sitemap** (5 分钟)
```bash
curl https://seedvr2.net/sitemap.xml | grep "draft"
# 应该无结果
```
4. **请求移除已索引的草稿** (20 分钟)
- 逐个提交移除请求
- 或等待自然去索引(1-2 周)
### 场景 3: Robots.txt 配置错误导致全站被阻止
**症状**:
```txt
# 错误配置
User-agent: *
Disallow: /
```
**后果**:
- 整个网站被阻止爬取
- 流量暴跌
**紧急修复** (5 分钟):
1. **立即修改 robots.txt**:
```txt
User-agent: *
Allow: / # ← 修复为 Allow
Disallow: /api/
Disallow: /admin/
# ... 其他规则
```
2. **部署修复**:
```bash
git add public/robots.txt
git commit -m "fix: correct robots.txt Allow rule"
git push origin main
```
3. **通知 Google** (10 分钟):
- GSC → 设置 → robots.txt 测试工具
- 输入修复后的 robots.txt
- 点击"提交到 Google"
4. **重新提交 Sitemap** (5 分钟):
- GSC → 站点地图
- 删除旧 sitemap
- 重新提交 `https://seedvr2.net/sitemap.xml`
5. **监控恢复** (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/raw-seo知识库-TXT整理-seo方法论-seo-knowledge-base-INDEX-PREVENTION--15c05d.txt(仅本地保留,不入库不部署)