IF
IndexFlowing
/ Docs
🌐 English Docs GitHub ↗

4. 引擎推送与 IndexNow

引擎推送流水线使用 Bing IndexNow API 和 Google Indexing API,将已验证但尚未索引的 URL 直接交付给搜索引擎。


智能推送资格规则

IndexFlow 消除重复 API 调用并保护搜索引擎配额。URL 只有同时满足全部条件时,才有资格进入后台提交:

┌──────────────────────────────────────────────────────────────┐
│                  Submission Eligibility Gate                 │
├──────────────────────────────────────────────────────────────┤
│ 1. SEO Gate Status   ─── seo_status != 'FAIL'                │
│ 2. Index Status      ─── {provider}_index_status != 'INDEXED'│
│ 3. Push History      ─── {provider}_status IN ('NONE','FAIL')│
│ 4. Engine Readiness  ─── Site credentials configured & active│
└──────────────────────────────────────────────────────────────┘

Worker 领取查询

Bing 队列领取(fetch_pending_bing):

SELECT * FROM urls
WHERE seo_status != 'FAIL'
  AND bing_status IN ('NONE', 'FAILED')
  AND bing_index_status != 'INDEXED'
ORDER BY priority ASC, id ASC
LIMIT $1;

Google 队列领取(fetch_pending_google):

SELECT * FROM urls
WHERE seo_status != 'FAIL'
  AND google_status IN ('NONE', 'FAILED')
  AND gsc_index_status != 'INDEXED'
ORDER BY priority ASC, id ASC
LIMIT $1;

Bing IndexNow 协议

IndexNow 允许网站管理员通知参与的搜索引擎(包括 Bing、Yandex、Naver 和 Seznam)内容新增与更新。

1. 验证文件

提交前,确保 32 位十六进制密钥托管在域名根目录:

https://example.com/a1b2c3d4e5f6789012345678abcdef01.txt

文件内容必须与密钥字符串完全一致。

2. 批量请求结构

IndexFlow 将多个 URL 合并到单个 HTTP POST 请求中,以降低连接开销:

  • 端点:POST https://api.indexnow.org/indexnow
  • 请求头:Content-Type: application/json; charset=utf-8
  • 请求体:
{
  "host": "example.com",
  "key": "a1b2c3d4e5f6789012345678abcdef01",
  "urlList": [
    "https://example.com/blog/rust-indexing-guide",
    "https://example.com/docs/installation",
    "https://example.com/pricing"
  ]
}

3. 响应状态评估

  • HTTP 200 / 202:密钥和 URL 批次已接受,URL 标记为 bing_status = 'SUBMITTED'。
  • HTTP 400:格式无效或密钥位置无效。
  • HTTP 403:密钥与文件不匹配或域名所有权验证失败。
  • HTTP 429:受到速率限制。worker 停止该批次并记录 is_quota_exceeded = true。

Google Indexing API

Google Indexing API 允许网站所有者在页面新增或更新时通知 Google。

1. 认证与 Scope

  • 协议:通过 RSA-SHA256 JWT assertion 生成 OAuth2 Bearer Token。
  • Scope:https://www.googleapis.com/auth/indexing
  • 目标端点:POST https://indexing.googleapis.com/v3/urlNotifications:publish

2. 请求体

Google 要求每个 URL 单独发送通知:

{
  "url": "https://example.com/blog/rust-indexing-guide",
  "type": "URL_UPDATED"
}

3. 24 小时滚动配额熔断器

Google 默认每天允许 200 次 URL 提交。IndexFlow 使用精确的 24 小时滚动窗口查询跟踪每个站点的提交量:

SELECT COUNT(*), MIN(sl.created_at)
FROM submission_logs sl
JOIN urls u ON u.id = sl.url_id
WHERE sl.provider = 'google'
  AND sl.success = 1
  AND u.site_id = $1
  AND sl.created_at > datetime('now', '-24 hours');

配额耗尽时:

  1. IndexFlow 计算 next_free_at(24 小时窗口中最早提交时间加 24 小时)。
  2. 将 sites.google_quota_paused_until = next_free_at。
  3. GoogleSubmitWorker 跳过该站点,直到最早配额槽位到期,避免 HTTP 429。

试运行模式机制

如需不消耗官方 API 配额测试工作流:

  1. 确保 .env 配置中为 DRY_RUN=true。
  2. Web 控制台标题栏中的 Dry-Run Badge 将处于激活状态。
  3. 触发推送操作会在 submission_logs 中生成模拟记录。
  4. URL 状态将在本地变为 SUBMITTED。

执行推送操作

通过 Web 控制台启动自动推送流水线

进入 /submit 并点击 Submit to All Engines。

通过 REST API 提交单个 URL

# Push single URL to Bing IndexNow
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/101/submit?provider=bing" \
  -H "Cookie: if_token=<YOUR_JWT_TOKEN>"

# Push single URL to Google Indexing API
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/101/submit?provider=google" \
  -H "Cookie: if_token=<YOUR_JWT_TOKEN>"

批量提交选定 URL

curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/batch-submit" \
  -H "Content-Type: application/json" \
  -H "Cookie: if_token=<YOUR_JWT_TOKEN>" \
  -d '{
    "selected_ids": [101, 102, 103],
    "provider": "bing"
  }'

响应:

{
  "submitted_count": 3,
  "success": true
}