IndexNow 是一个推送协议,一次提交 URL,同时通知 Bing、Yandex、Naver、Seznam 等多家海外搜索引擎来抓取你的新页面,不用每个站长平台单独提交。百度不支持 IndexNow,继续用百度自己的普通收录 API,两套并行不冲突。
一、IndexNow 支持哪些搜索引擎
| 搜索引擎 | 地区 | 支持情况 |
|---|---|---|
| Bing 必应 | 全球 | 完全支持 |
| Yandex | 俄罗斯 | 完全支持 |
| Naver | 韩国 | 支持 |
| Seznam | 捷克 | 支持 |
| Yep | 全球 | 支持 |
| Mojek | 波兰 | 支持 |
| 百度 | 中国大陆 | 不支持 |
二、和百度推送的区别
| 对比项 | 百度普通收录 | IndexNow |
|---|---|---|
| 推送对象 | 百度 | Bing / Yandex / Naver 等 |
| 接口地址 | data.zz.baidu.com | api.indexnow.org/indexnow |
| 推送方式 | POST text/plain | POST application/json |
| 所有权验证 | 不需要,用 token | 需要在根目录放密钥文件 |
| 单次 URL 数 | 每日有额度 | 单次最多 100 条 |
三、第一步:放密钥验证文件
1. 生成密钥
去 indexnow.org 官网可以自动生成一个随机密钥,也可以自己写一段 8 到 128 位的字符串,只允许大小写字母、数字和横线。
比如:
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
2. 创建 txt 文件
在网站根目录新建一个 txt 文件,文件名就是密钥本身,例如:
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6.txt
文件内容只写密钥,不要多空格、不要换行:
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
3. 验证文件能不能访问
浏览器打开你的密钥 txt 文件地址,必须满足:
- 裸文本直接显示密钥
- HTTP 状态码 200
- 不能 404、不能 403、不能 301 跳转
- 海外 IP 也能访问(国内能打开不代表海外 Bing 爬虫能打开)
几个容易踩的坑:
- 密钥区分大小写,文件名大小写错一个字符就失败。
- 文件编码必须是 UTF-8 无 BOM。
- 文件内容不能有多余的换行和空格。
- 国内服务器如果有安全软件或者防火墙拦截了海外 IP,搜索引擎后端访问不到这个 txt,会返回 403。
四、第二步:WordPress functions.php 自动推送
把下面代码加到当前主题的 functions.php 文件最末尾,实现发布或更新文章时自动推送,以后新增文章不用手动跑脚本。
<?php
/**
* IndexNow 自动实时推送钩子
* 功能:发布 / 更新已发布文章时,自动提交 URL 到 IndexNow
* 触发:save_post,自动过滤自动草稿、修订、自动保存
*/
function custom_indexnow_auto_push( $post_id ) {
// 跳过自动保存、修订版本
if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
return;
}
$post = get_post( $post_id );
// 只处理已发布的文章 / 页面
if ( ! $post || $post->post_status !== 'publish' ) {
return;
}
// ===== 配置区(改成你自己的)=====
$site_host = '你的域名.com';
$indexnow_key = '你的密钥';
$key_location = 'https://你的域名.com/你的密钥.txt';
// ==================================
$post_url = get_permalink( $post_id );
$payload = json_encode([
'host' => $site_host,
'key' => $indexnow_key,
'keyLocation' => $key_location,
'urlList' => [ $post_url ],
], JSON_UNESCAPED_SLASHES);
$args = [
'headers' => [
'Content-Type' => 'application/json; charset=utf-8',
],
'body' => $payload,
'timeout' => 10,
'method' => 'POST',
];
wp_remote_post( 'https://api.indexnow.org/indexnow', $args );
// 如需推送结果邮件通知,取消下面注释
// @wp_mail( '你的邮箱@xx.com', 'IndexNow 自动推送', 'URL: ' . $post_url );
}
add_action( 'save_post', 'custom_indexnow_auto_push' );
怎么用
- 复制上面代码,打开 WordPress 后台 → 外观 → 主题文件编辑器 → 找到
functions.php。 - 把代码粘贴到文件最末尾,保存。
- 修改配置区的域名、密钥、密钥文件地址。
- 发布一篇测试文章,看是否触发推送。
建议用子主题的 functions.php,避免主题升级覆盖掉你添加的代码。如果网站崩溃,直接删掉这段代码就能恢复。
五、批量推送存量文章脚本
自动推送只管新增和更新文章,存量历史文章需要用批量脚本一次性推送。新建一个 PHP 文件放到网站根目录,比如 push.php:
<?php
$host = "你的域名.com";
$key = "你的密钥";
$keyLocation = "https://你的域名.com/你的密钥.txt";
// 要推送的 URL 列表,单次最多 100 条
$urlList = [
"https://你的域名.com/post-1.html",
"https://你的域名.com/post-2.html",
"https://你的域名.com/post-3.html",
// 继续加,不要超过 100 条
];
$postData = json_encode([
"host" => $host,
"key" => $key,
"keyLocation" => $keyLocation,
"urlList" => $urlList,
], JSON_UNESCAPED_SLASHES);
$opts = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json; charset=utf-8\r\n",
'content' => $postData,
'timeout' => 30,
],
];
$context = stream_context_create($opts);
$result = file_get_contents('https://api.indexnow.org/indexnow', false, $context);
$responseHeaders = $http_response_header;
echo "推送数量:" . count($urlList) . " 条<br>";
echo "返回内容:" . var_export($result, true) . "<br>";
echo "<pre>响应头:";
print_r($responseHeaders);
echo "</pre>";
?>
浏览器访问 https://你的域名.com/push.php 即可提交。单次最多 100 条 URL,超过就分批。
六、接口返回码说明
| HTTP 状态码 | 含义 | 排查方向 |
|---|---|---|
| 200 OK | 提交成功 | 响应体为空是正常的 |
| 400 Bad Request | 请求格式错误 | JSON 格式不对、URL 非法 |
| 403 Forbidden | 密钥校验失败 | 搜索引擎访问不到你的 txt 文件,或文件内容不对 |
| 422 Unprocessable Entity | URL 域名不匹配 | urlList 里的域名和 host 字段不一致 |
| 429 Too Many Requests | 请求过多 | 频率太高,隔几分钟再试 |
提交成功的标志是 HTTP 200,响应体 Content-Length 为 0,这是正常现象,不是报错。
七、常见问题排查
1. 访问密钥 txt 返回 404
- 检查文件名是否和密钥完全一致(大小写敏感)。
- 检查文件是否在网站根目录。
- 检查伪静态规则是否拦截了 txt 文件。
2. 提交返回 403
- 国内浏览器能打开 txt,但海外 Bing 爬虫打不开。
- 检查服务器防火墙或安全组是否限制了海外 IP。
- 检查 CDN 或安全防护是否拦截了海外请求。
3. 提交返回 400
- JSON 格式错误,少括号或者引号没闭合。
- urlList 为空。
- URL 里带了多余的标记,要填纯 URL。
4. PHP 脚本访问报 500
- 检查 php.ini 的 allow_url_fopen 是否开启,必须是 On。
- 检查 disable_functions 是否禁用了 file_get_contents。
- 看 PHP 错误日志定位。
5. 脚本返回空、没有响应头
- 服务器出站网络无法访问 api.indexnow.org,国内服务器比较常见。
- 可以尝试用 CDN 或者海外中转服务器跑脚本。
八、注意事项
- 单次最多提交 100 条 URL,超过就分批。
- 不要反复推送未修改的旧 URL,不会加速收录,反而可能被判定为垃圾提交。
- 批量推送脚本用完就删,不要长期留在公网,防止别人恶意调用触发 429 限流。
- 如果必须保留脚本,加访问密码,只允许自己访问。
- IndexNow 只推海外搜索引擎,百度继续用自己的普通收录 API,两套并行。
- 提交成功只是通知搜索引擎来抓取,不等于立刻收录,收录还要看页面质量和网站权重。
九、快速上手清单
- 生成密钥,根目录放密钥 txt 文件
- 浏览器访问 txt 文件,确认返回 200、裸文本显示密钥
- 确认海外 IP 也能访问这个 txt
- 把 functions.php 钩子加到主题文件末尾
- 修改钩子代码里的域名和密钥
- 发布一篇测试文章,验证自动推送是否生效
- 用批量脚本把存量文章分批推送一次
- 用完删除批量脚本
- 百度继续用原来的推送方式,互不影响
