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');
配额耗尽时:
- IndexFlow 计算
next_free_at(24 小时窗口中最早提交时间加 24 小时)。 - 将
sites.google_quota_paused_until = next_free_at。 GoogleSubmitWorker跳过该站点,直到最早配额槽位到期,避免 HTTP 429。
试运行模式机制
如需不消耗官方 API 配额测试工作流:
- 确保
.env配置中为DRY_RUN=true。 - Web 控制台标题栏中的 Dry-Run Badge 将处于激活状态。
- 触发推送操作会在
submission_logs中生成模拟记录。 - 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
}