discourse-indexnow — 话题创建或编辑后自动通知Bing与Yandex

:information_source: 简介 自动把新建、编辑和删除后的公开话题 URL 提交给 IndexNow 协议,让 Bing、Yandex 等兼容搜索引擎能在几分钟内发现或下架你的内容,而不是等待爬虫慢慢抓取。
:hammer_and_wrench: 仓库地址 github.com/imlotso/discourse-indexnow
:open_book: 安装指南 How to install plugins in Discourse

功能特性

  • 新话题发布时自动提交,编辑改动了首帖或话题关键属性时自动重新提交。
  • 回复触发提交:产生新回复时自动提交对应分页 URL(如 ?page=3),并支持单 URL 冷却时间,防止频繁刷提交。
  • 话题被删除时自动提交对应 URL,帮助搜索引擎更快检测到 404/410 并加速下架。
  • 站点开启 Content Localization 及其爬虫 locale 参数时,会自动把本地化话题 URL 一并提交——使用 Discourse 实际配置的 locale 查询参数,不做硬编码。
  • 把主 URL 和已有的本地化 URL 合并为一次 IndexNow urlList 批量请求,而不是逐条单独提交。
  • 历史帖子补量:按分类和日期范围筛选话题,先预览匹配结果,再一次性批量提交——复用同一套批量提交引擎,超过协议单次 10,000 条上限时会自动分片。仍在处理中的批次(比如误选了过大的范围)可以直接在 Logs 标签页取消。
  • 手动提交:每行粘贴一个 URL 即可按需提交指定链接,外部链接和不符合条件的话题会被自动过滤。
  • 智能限流与配额管理:支持基于平滑滑动窗口 (Sliding window) 的每小时/每日提交上限。遇到 IndexNow 的 429 响应时会自动退避(优先遵循 Retry-After 头)。管理后台提供直观的配额进度条与额度恢复倒计时。
  • 支持排除指定分类和标签,在自动隐私过滤之外再叠加一层业务层排除规则。
  • 支持密钥轮换(带有防误触二次确认提示),生成新密钥会立即使旧密钥失效。
  • 管理后台内置 /<key>.txt 公网可达性检查。
  • 话题被移动分类、分类可见性变化或标签更新时,会自动异步重新提交或同步排除,大批量操作不阻塞页面。
  • 日志记录批次 ID、locale、触发原因(新建/编辑/删除/分类变更/补量/手动)、近 7 天成功/失败趋势,以及失败原因分类(限流 / 密钥错误 / 域名不匹配 / 其他)。
  • 所有提交均异步执行,且和自动提交走同一套隐私过滤逻辑——私信、受限分类、未列出/已删除话题、开启登录要求的站点,一律不会被提交。
  • 管理界面提供英文和简体中文两种语言。

配置步骤

  1. 按上方安装指南安装插件,重建容器。
  2. 打开 Admin > Plugins > discourse-indexnow。
  3. 在 Settings 标签页点击 Generate key(也可以填入你已经在别处注册好的 32 位十六进制密钥)。
  4. 勾选 Enable IndexNow submissions。
  5. 确认密钥在公网可访问:
https://你的论坛域名/<key>.txt

正常应返回 HTTP 200,内容为密钥本身。管理后台也会自动做这项检查,并在"key.txt 可访问"旁显示带缓存的绿色/红色状态。
6.(可选)在 Logs 标签页使用"补量提交"面板:选择分类和日期范围,点击 预览 查看匹配数量,再点击 提交。如果批次还在处理中,可以在同一页面取消。
7.(可选)使用手动提交输入框,每行粘贴一个 URL,即可在常规自动流程之外立即提交指定链接。

Logs 页面还会显示配额使用进度条、近 7 天成功/失败趋势图和失败原因分类统计,方便一眼看出提交失败究竟是被限流、密钥不匹配,还是其他原因。

配置项

名称 说明
indexnow_enabled 插件总开关。站点开启 login_required 时无法启用,若之后开启该设置插件会自动禁用。
indexnow_api_key 当前用于提交验证的 32 位十六进制密钥。
indexnow_submit_on_create 新公开话题发布时自动提交。
indexnow_submit_on_edit 首帖或话题属性变化后自动重新提交。
indexnow_submit_on_reply 产生新回复时自动提交该回复所在的分页 URL。
indexnow_url_cooldown_minutes 单个 URL 的防刷新冷却时间(分钟)。
indexnow_excluded_category_ids 额外排除的分类,即使该分类本身是公开的也不会提交。
indexnow_excluded_tag_names 额外排除的标签,即使话题所属分类本身符合提交条件也不会提交。
indexnow_hourly_limit 每小时最多提交的 URL 数量(基于滑动窗口)。
indexnow_daily_limit 每天最多提交的 URL 数量(基于滑动窗口)。

已知限制

  • Google 目前未加入 IndexNow 协议。
  • 只有在爬虫 locale 参数启用且该话题确实存在对应本地化内容时,才会提交本地化 URL。
  • 目前首帖编辑以及后续回复分页变动已获支持,但中间楼层的单独编辑暂不单独触发提交。

这是一个独立开发、非 Discourse 官方维护的插件。目前已经在我自己的论坛生产环境运行,配有 RSpec 测试并在每次 push/PR 时跑 CI,欢迎通过 GitHub issue 或本贴回复反馈问题和功能建议。