知识库首页 seo-llm 资料 INDEX-PREVENTION-SOP.md.txt

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(仅本地保留,不入库不部署)