为什么需要 IndexNow 与 Sitemap 协同
传统收录流程依赖搜索引擎爬虫按计划抓取 sitemap,新文章从发布到被 Bing 等引擎发现往往需要数小时甚至数天。IndexNow 协议允许站点主动推送 URL 变更,将这一过程缩短到几分钟。但 IndexNow 并非替代 sitemap,二者分工明确:sitemap 负责全量、结构化的 URL 清单,IndexNow 负责增量、实时的变更通知。
核心原则:sitemap 保证“不漏”,IndexNow 保证“不慢”。
IndexNow 协议原理
IndexNow 是一个开放协议,由微软 Bing 等搜索引擎联合推动。站点通过 HTTPS POST 请求向 IndexNow 端点提交 URL,端点将变更分发给参与的搜索引擎。协议本身不存储页面内容,只传递“哪些 URL 发生了变更”这一信号。
- 提交方式:单个 URL 或 URL 列表(JSON 格式)。
- 认证机制:基于密钥文件,证明站点所有权。
- 响应:HTTP 状态码表示接受、拒绝或错误。
- 分发范围:目前主要被 Bing、Yandex、Seznam 等采用,Google 尚未加入。
密钥文件部署
使用 IndexNow 前,需在站点根目录放置一个 UTF-8 文本文件,文件名为 {密钥}.txt,内容与文件名中的密钥一致。密钥为 8-128 位字母数字字符串。
例如密钥为 a1b2c3d4e5f6,则创建文件 https://example.com/a1b2c3d4e5f6.txt,内容为:
a1b2c3d4e5f6部署后可通过浏览器直接访问该 URL 验证。若返回 404 或内容不匹配,提交将失败。
API 调用与返回码含义
IndexNow 端点统一为 https://api.indexnow.org/indexnow,也支持各搜索引擎独立端点(如 Bing 的 https://www.bing.com/indexnow)。推荐使用统一端点,由协议层自动分发。
请求格式
支持两种方式:
- 提交单个 URL:GET 或 POST,参数包含
url、key、keyLocation。 - 提交 URL 列表:POST JSON,包含
host、key、keyLocation、urlList。
{
"host": "example.com",
"key": "a1b2c3d4e5f6",
"keyLocation": "https://example.com/a1b2c3d4e5f6.txt",
"urlList": [
"https://example.com/new-article-1",
"https://example.com/new-article-2"
]
}返回码解读
| 状态码 | 含义 | 处理建议 |
|---|---|---|
| 200 | 成功接受 | 无需操作 |
| 202 | 已接受,待验证 | 检查密钥文件可访问性 |
| 400 | 请求格式错误 | 检查 JSON 字段与 URL 格式 |
| 403 | 密钥无效或未找到 | 确认密钥文件路径与内容 |
| 422 | URL 不属于该 host 或密钥不匹配 | 核对 host 与 urlList 域名 |
| 429 | 请求过于频繁 | 降低提交频率,加入重试退避 |
注意:200 仅表示端点已接受请求,不保证搜索引擎一定收录。收录仍取决于内容质量与站点权重。
IndexNow 与 Sitemap 的分工
| 维度 | IndexNow | Sitemap |
|---|---|---|
| 目的 | 实时通知 URL 变更 | 全量声明站点 URL |
| 时效 | 分钟级 | 小时到天级 |
| 覆盖范围 | 增量、单次提交 | 全站、结构化 |
| 支持引擎 | Bing、Yandex 等 | 几乎所有搜索引擎 |
| 认证方式 | 密钥文件 | 无(依赖 robots.txt 声明) |
| 适用场景 | 新文章、更新、删除 | 全站索引、历史内容 |
最佳实践:保持 sitemap 自动更新并提交到 Bing 等站长平台,同时在新文章发布或旧文章更新时调用 IndexNow 推送变更 URL。二者结合,既保证全量覆盖,又实现快速收录。
PHP 实现代码
以下代码演示如何通过 cURL 向 IndexNow 提交 URL 列表,并处理返回码。
<?php
function submitIndexNow(array $urls, string $host, string $key, string $keyLocation): array
{
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = json_encode([
'host' => $host,
'key' => $key,
'keyLocation' => $keyLocation,
'urlList' => $urls,
], JSON_UNESCAPED_SLASHES);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json; charset=utf-8'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
return [
'http_code' => $httpCode,
'response' => $response,
'error' => $error,
];
}
// 示例调用
$result = submitIndexNow(
['https://example.com/new-article-1', 'https://example.com/new-article-2'],
'example.com',
'a1b2c3d4e5f6',
'https://example.com/a1b2c3d4e5f6.txt'
);
if ($result['http_code'] === 200 || $result['http_code'] === 202) {
echo '提交成功';
} else {
error_log('IndexNow 提交失败: ' . $result['http_code'] . ' ' . $result['error']);
}排错清单
- 密钥文件无法访问:检查文件是否位于站点根目录,是否被防火墙或重写规则拦截。
- 返回 403:确认密钥文件名与内容一致,且为 UTF-8 无 BOM 格式。
- 返回 422:检查
host是否与 URL 域名完全匹配,urlList中每个 URL 是否属于该 host。 - 提交后未收录:IndexNow 只通知变更,不保证收录。需结合内容质量、内链、sitemap 综合优化。
- 频率限制:避免短时间内大量重复提交,建议对同一 URL 设置最小提交间隔(如 10 分钟)。
- 日志记录:记录每次提交的 URL、返回码与时间,便于回溯。
常见问题
IndexNow 能替代 sitemap 吗?
不能。IndexNow 是增量通知协议,不提供全量 URL 清单。sitemap 仍是搜索引擎发现站点结构的基础。二者应同时使用。
IndexNow 支持 Google 吗?
截至当前,Google 未加入 IndexNow。Google 依赖 sitemap、内链和 Search Console 提交。IndexNow 主要影响 Bing、Yandex 等引擎。
提交后多久能被收录?
若站点质量良好,Bing 通常在几分钟到几小时内抓取并更新索引。但收录速度受站点权重、内容质量、服务器响应等因素影响,IndexNow 只缩短发现时间。
删除文章需要提交 IndexNow 吗?
需要。当文章被删除或返回 404/410 时,应通过 IndexNow 提交该 URL,通知搜索引擎移除索引。同时更新 sitemap 移除该 URL。
评论 (0)