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

INDEX PREVENTION SOP

本地来源:seo-llm/SEO/Guideline/INDEX-PREVENTION-SOP.md

防止意外索引操作手册 (Index Prevention SOP)

最后更新: 2026-01-23 重要性: 🚨 极高 - 防止敏感页面、管理后台、草稿被搜索引擎索引


📋 目录

  1. 为什么需要防止意外索引
  2. 三层防护体系
  3. Robots.txt 配置详解
  4. Meta Robots 标签详解
  5. 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

# 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 标签,直接告诉搜索引擎如何处理当前页面:

&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot; /&gt;

常用指令

指令 作用
index 允许索引(默认)
noindex 禁止索引
follow 允许跟踪链接(默认)
nofollow 禁止跟踪链接
noarchive 禁止缓存页面
nosnippet 禁止显示摘要

组合用法

<!-- 最严格:不索引,不跟踪链接 -->
&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot; /&gt;

<!-- 不索引,但可以跟踪链接 -->
&lt;meta name=&quot;robots&quot; content=&quot;noindex, follow&quot; /&gt;

<!-- 允许索引,但不缓存 -->
&lt;meta name=&quot;robots&quot; content=&quot;index, follow, noarchive&quot; /&gt;

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:

&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow, nocache&quot; /&gt;
&lt;meta name=&quot;googlebot&quot; content=&quot;noindex, nofollow&quot; /&gt;

方法 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

  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.txtAllow: /
  • [x] 页面 metadata → robots: { index: true, follow: true }
  • [x] src/app/sitemap.ts → 添加到 staticRoutes

博客文章(条件索引)

  • [x] public/robots.txtAllow: /blog
  • [x] 已发布文章 → published: true
  • [x] 草稿文章 → published: false
  • [x] src/app/sitemap.ts → 过滤 published === true

管理后台(严格禁止)

  • [x] public/robots.txtDisallow: /admin/
  • [x] Layout metadata → robots: { index: false, follow: false }
  • [x] Sitemap → 不添加 /admin/* 路由

SEO 后台(严格禁止) ⚠️

  • [x] public/robots.txtDisallow: /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: 命令行验证

# 检查特定路径是否被 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)
# 搜索: &lt;meta name=&quot;robots&quot;

# 应该看到:
&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot; /&gt;

方法 B: 使用 curl

# 检查 admin 页面
curl -s https://seedvr2.net/admin | grep -i "robots"

# 应该输出:
&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot;/&gt;

# 检查 SEO 后台
curl -s https://seedvr2.net/seo | grep -i "robots"

# 应该输出:
&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot;/&gt;

方法 C: 使用浏览器开发者工具

  1. 访问 https://seedvr2.net/admin
  2. 打开开发者工具 (F12)
  3. Elements 标签 → 查看 <head> 部分
  4. 确认存在 &lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot;&gt;

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 验证

  1. 登录 GSC → 覆盖率
  2. 查看"已排除"部分
  3. 确认敏感页面在"已被 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 路由

修复步骤:

  1. 检查 public/robots.txt:
Disallow: /seo/    ← 确认存在
  1. 检查 src/app/[locale]/(protected)/seo/layout.tsx:
export const metadata = {
  robots: {
    index: false,
    follow: false,
  },
}
  1. 检查 src/app/sitemap.ts 不包含 /seo 路由

  2. 请求 Google 移除: - GSC → 移除 → 临时移除 - 输入 URL: https://seedvr2.net/seo

错误 2: 草稿文章被索引

症状:

site:seedvr2.net/blog/unfinished-article
# 返回结果:未完成的草稿文章

原因: - Frontmatter 中 published: true(应该是 false) - Sitemap 过滤逻辑错误

修复步骤:

  1. 修改 Frontmatter:
---
title: "Unfinished Article"
published: false    # ← 改为 false
---
  1. 重新构建:
pnpm build
  1. 验证 sitemap 不包含该文章:
curl https://seedvr2.net/sitemap.xml | grep "unfinished-article"
# 应该无结果
  1. 请求 Google 移除(如果已索引)

错误 3: Robots.txt 拼写错误

症状:

curl https://seedvr2.net/robots.txt
# HTTP 404 Not Found

原因: - 文件名拼写错误:robot.txt 而非 robots.txt - 文件位置错误:不在 public/ 目录

修复步骤:

  1. 确认文件路径:
ls -la public/robots.txt
# 应该存在
  1. 确认文件名正确(复数 robots

  2. 重新部署

错误 4: Meta Robots 被覆盖

症状: - Layout 设置了 noindex - 但页面级别设置了 index - 页面最终被索引

原因: - 页面级别 metadata 覆盖了 Layout metadata

修复步骤:

  1. 检查页面文件 page.tsx:
// ❌ 错误:覆盖了 Layout 的 noindex
export const metadata = {
  robots: {
    index: true,  // ← 删除这行
  },
}
  1. 只在 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

修复步骤:

  1. 在动态路由页面设置:
// src/app/[locale]/(protected)/share/[id]/page.tsx
export const metadata = {
  robots: {
    index: false,
    follow: true,
  },
}
  1. 或在 Layout 统一设置:
// src/app/[locale]/(protected)/share/layout.tsx
export const metadata = {
  robots: {
    index: false,
    follow: true,
  },
}

紧急情况处理

场景 1: 敏感页面已被索引

发现方式:

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"/> ```

  1. 请求 Google 紧急移除 (10 分钟) - 登录 GSC - 左侧菜单 → 移除 - 点击"新请求" - 选择"临时移除 URL" - 输入: https://seedvr2.net/admin - 提交请求 - 生效时间: 1 天内

  2. 批量移除子路径 (10 分钟) - 如果有多个子路径被索引 - 使用通配符: https://seedvr2.net/admin/* - 可以一次性移除整个目录

  3. 长期解决 (1-2 周) - 等待 Google 重新爬取 - 看到 noindex 后自动移除 - 在 GSC "覆盖率" 中确认"已排除"

场景 2: 大量草稿被索引

发现方式:

site:seedvr2.net/blog
# 结果:包含未发布的草稿文章

立即操作:

  1. 批量修改 Frontmatter (15 分钟) ```bash # 查找所有草稿文件 grep -l "published: true" content/blog/*/.mdx

# 批量替换为 false(需要确认) # 手动修改,避免误操作 ```

  1. 重新构建和部署 (10 分钟) bash pnpm build git add . git commit -m "fix: set draft articles to unpublished" git push origin main

  2. 验证 Sitemap (5 分钟) bash curl https://seedvr2.net/sitemap.xml | grep "draft" # 应该无结果

  3. 请求移除已索引的草稿 (20 分钟) - 逐个提交移除请求 - 或等待自然去索引(1-2 周)

场景 3: Robots.txt 配置错误导致全站被阻止

症状:

# 错误配置
User-agent: *
Disallow: /

后果: - 整个网站被阻止爬取 - 流量暴跌

紧急修复 (5 分钟):

  1. 立即修改 robots.txt: ```txt User-agent: * Allow: / # ← 修复为 Allow

Disallow: /api/ Disallow: /admin/ # ... 其他规则 ```

  1. 部署修复: bash git add public/robots.txt git commit -m "fix: correct robots.txt Allow rule" git push origin main

  2. 通知 Google (10 分钟): - GSC → 设置 → robots.txt 测试工具 - 输入修复后的 robots.txt - 点击"提交到 Google"

  3. 重新提交 Sitemap (5 分钟): - GSC → 站点地图 - 删除旧 sitemap - 重新提交 https://seedvr2.net/sitemap.xml

  4. 监控恢复 (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(仅本地保留,不入库不部署)