2. 技术 SEO 与 GEO 质量门
技术 SEO 与 GEO 质量门会在 URL 进入搜索引擎提交队列前执行预检,阻止损坏页面、配置错误的索引标签和 canonical 冲突,避免浪费爬取预算。
硬门决策规则(passed = false)
页面违反以下任一核心规则时,会获得 seo_status = 'FAIL' 和具体 block_reason,并被严格禁止进入外部搜索引擎提交队列:
┌──────────────────────────────────────────────────────────────┐
│ Pre-Flight SEO Gate │
├──────────────────────────────────────────────────────────────┤
│ 1. HTTP Status Code ─── Must be 200 OK (3xx, 4xx, 5xx FAIL) │
│ 2. Noindex Directive ─── No noindex in Meta or X-Robots-Tag │
│ 3. Canonical Tag ─── Canonical URL must match Page URL │
│ 4. Page Title ─── Non-empty <title> tag required │
└──────────────────────────────────────────────────────────────┘
1. HTTP 状态检查
- 规则:URL 必须返回精确的
200 OK状态。 - 重定向即失败:IndexFlow 不跟随重定向探测 URL(
redirect::Policy::none())。301 或 302 会以HTTP 301/HTTP 302使检查失败,因为 sitemap 只能列出最终 canonical 目标 URL。
2. noindex 指令
- 规则:响应不得指示爬虫跳过索引。
- 检查点:
<meta name="robots" content="noindex">、<meta name="googlebot" content="noindex">、<meta http-equiv="robots" content="noindex">、HTTP header:X-Robots-Tag: noindex或X-Robots-Tag: none。
3. Canonical URL 等价性(canonical_matches_page)
- 规则:声明的
<link rel="canonical" href="...">必须解析为被检查的页面 URL。 - 规范化规则:scheme 和 hostname 转为小写;移除默认端口;解析相对路径和协议相对路径;规范化
.与..;解码 UTF-8 百分号编码路径;去除尾部斜杠(根路径除外);去除 URL fragment;按 key 和 value 排序查询参数;URL 路径按 RFC 3986 保持大小写敏感。
4. 页面标题标签存在性
- 规则:HTML 文档必须在
<script>或注释块外包含非空的<title>...</title>元素。
软警告与优化信号(seo_status = 'WARN')
页面通过四条硬门规则后,IndexFlow 会评估 SEO 和 GEO(生成式引擎优化)信号。如发现问题,URL 标记为 seo_status = 'WARN',仍可进入推送队列并携带提示性警告。
| 信号 | 评估标准 | 警告消息 |
|---|---|---|
| 标题结构 | 可见 <h1> 数量 |
缺少 H1 标题 或 存在 N 个 H1 标签,建议仅保留一个 |
| Robots Nofollow | 检查 meta 或 header 中的 nofollow |
页面带有 nofollow 指令 |
| AI Bot 指令 | 检查 AI 搜索爬虫是否被阻断 | 屏蔽了以下 AI 爬虫: GPTBot, ClaudeBot... |
| OpenGraph 元数据 | 缺少 og:title、og:image、og:type 等 |
缺少 OpenGraph 社交分享标签 |
| Twitter Card | 缺少 <meta name="twitter:card"> |
缺少 Twitter Card 标记 |
| 结构化数据 | 缺少 <script type="application/ld+json"> |
缺少结构化数据 (JSON-LD) |
| 移动视口 | 缺少 <meta name="viewport"> |
缺少 viewport 移动适配标签 |
| 语言标签 | 缺少 <html lang="..."> |
未声明 <html lang> 页面语言 |
| 图片无障碍 | 没有非空 alt 的 <img> 数量 |
N 张图片缺失 alt 属性 |
| Meta Description | 缺失或字符数不在 50..=160 |
缺少 meta description 或 meta description 长度不合适 |
| 标题长度 | 字符数 > 60 | page title 长度过长,可能被截断 |
GEO 与 AI 爬虫审计
IndexFlow 跟踪主要 GEO bot 的索引和训练权限:
| AI Crawler | Target Directive Tokens | Impact |
|---|---|---|
| OpenAI GPTBot | name="gptbot"、name="chatgpt-user"、X-Robots-Tag: gptbot: noindex |
影响 ChatGPT 搜索中的索引。 |
| Anthropic ClaudeBot | name="claudebot"、name="anthropic-ai"、name="claude-web" |
影响 Claude 中的索引和引用。 |
| PerplexityBot | name="perplexitybot"、name="perplexity" |
影响 Perplexity AI 的实时引用。 |
| Google-Extended | name="google-extended"、X-Robots-Tag: google-extended: noai |
影响 Gemini 训练和 AI Overview 引用。 |
Schema.org 结构化数据提取
引擎提取 JSON-LD 块并解析所有声明的 @type 实体,包括 @graph 树和数组类型声明。
并发与探测引擎
- 并发:
SeoAuditWorker通过tokio::sync::Semaphore最多运行 30 个并发审计任务。 - 负载安全上限:响应体以 5 MiB 硬上限(
MAX_HTML_BODY)流式读取;声明Content-Length > 20 MiB的响应跳过解析。 - 自定义爬虫 UA:自动追加站点的
custom_user_agenttoken,以绕过 Cloudflare Bot Fight Mode。
执行技术 SEO 审计
通过 Web 控制台触发审计流水线
进入 /seo 并点击 Run SEO Audit。
通过 REST API 审计单个 URL
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/101/inspect?engine=seo" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>"
批量审计多个 URL
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/batch-inspect" \
-H "Content-Type: application/json" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>" \
-d '{
"selected_ids": [101, 102, 103],
"engine": "seo"
}'