织梦必应推送接口配置文件

问题背景

必应(Bing)从 2021 年起全面采用 IndexNow 协议接收主动推送,相比传统的 sitemap 提交,IndexNow 能让新页面在数分钟内被必应发现并抓取,对织梦 DedeCMS 这类信息发布型站点来说,是提升必应收录效率的重要手段。但织梦官方未内置 IndexNow 推送逻辑,需要自行开发配置文件。

原因分析

IndexNow 协议特点

IndexNow 是一个由 Microsoft、Yandex、Seznam 联合推出的开放协议,核心机制:站点生成一个 key,把 key 文件放在站点根目录,然后向搜索引擎提交 URL+key 即可完成推送。一次推送,多搜索引擎共享。

为什么要主动推送

必应蜘蛛的天然抓取频率低于百度,新发布文章若不主动推送,可能数天甚至数周才被发现,错过内容时效性窗口。

解决步骤

一、生成 API key

访问 https://www.bing.com/indexnow,生成一个 32 位十六进制字符串作为 key,例如 1a2b3c4d5e6f7890abcdef1234567890

二、在站点根目录放置 key 文件

新建 /{key}.txt,内容就是 key 本身:

1a2b3c4d5e6f7890abcdef1234567890

确保 https://www.example.com/1a2b3c4d5e6f7890abcdef1234567890.txt 可访问。

三、编写推送类文件

/include/ 下新建 bingpush.class.php

<?php
class BingIndexNow {
    private $key='1a2b3c4d5e6f7890abcdef1234567890';
    private $endpoint='https://api.indexnow.org/indexnow';

    public function push($urls){
        if(!is_array($urls)) $urls=array($urls);
        $host=$_SERVER['HTTP_HOST'] ?? 'www.example.com';
        $payload=array(
            'host'=> $host,
            'key'=> $this->key,
            'keyLocation'=> 'https://'.$host.'/'.$this->key.'.txt',
            'urlList'=> $urls
        );
        $ch=curl_init($this->endpoint);
        curl_setopt_array($ch, array(
            CURLOPT_POST=> true,
            CURLOPT_HTTPHEADER=> array('Content-Type: application/json; charset=utf-8'),
            CURLOPT_POSTFIELDS=> json_encode($payload),
            CURLOPT_RETURNTRANSFER=> true,
            CURLOPT_TIMEOUT=> 10,
            CURLOPT_SSL_VERIFYPEER=> false
        ));
        $resp=curl_exec($ch);
        $code=curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return array('code'=>$code, 'body'=>$resp);
    }
}

四、文章发布时调用

修改 /dede/archives_add.php,在文章入库成功后追加:

require_once(DEDEINC.'/bingpush.class.php');
$push=new BingIndexNow();
$arcurl='https://www.example.com'.$artUrl;
$push->push(array($arcurl));

五、批量补推历史文章

写一个临时脚本 /dede/bingpush_all.php,遍历 archives 表,把未推送的文章 URL 推送一遍:

$dsql->SetQuery("SELECT id, typeid FROM dede_archives WHERE arcrank>-1");
$dsql->Execute();
while($row=$dsql->GetArray()){
    $url='https://www.example.com/'.GetFileUrl($row['id'],$row['typeid']);
    $urls[]=$url;
    if(count($urls)>=10000){  // IndexNow 单次上限 10000
        $push->push($urls); $urls=array();
        sleep(1);
    }
}

配置示例汇总

IndexNow 返回 200 表示已接收,202 表示稍后处理,422 表示 key 验证失败,需重点排查 key 文件是否可访问。

注意事项

  • 同一 URL 重复推送不会扣分,但浪费配额,建议加去重日志表。
  • 推送 URL 必须是完整的 https 链接,且与站点 host 一致。
  • key 文件 HTTP 状态必须是 200,不能 301/302,否则验证失败。
  • IndexNow 还会自动同步到 Yandex、Seznam、Naver,多语种站点收益明显。
  • 必应站长后台可查看 IndexNow 推送统计,作为效果评估依据。

实施建议

建议把 IndexNow 推送与百度推送、360 推送、搜狗推送整合到一个统一的 push 任务调度器中,文章发布时一次性多通道推送。同时把推送结果写入日志表,每日统计成功率,作为站点内容分发健康度指标。后续可以观察必应收录曲线,确认推送与收录的转化率,反推内容质量评分,让推送策略持续优化。