IF
IndexFlowing
/ Docs
🌐 English Docs GitHub ↗

1. Sitemap 引擎

Sitemap 引擎负责资源发现。它抓取、解压、解析并规范化标准 XML sitemap、sitemap 索引层级、.xml.gz 存档和纯文本 URL 列表中的 URL 条目。


技术规格与协议限制

Sitemap 引擎执行 Google Sitemap 协议限制和防御性保护:

参数 常量 值 描述
最大文档大小 MAX_UNCOMPRESSED_BYTES 50 MiB (52,428,800 bytes) 单个 sitemap 文件允许的最大解压负载。
最大下载大小 MAX_DOWNLOAD_BYTES 52 MiB (54,525,952 bytes) 最大 HTTP 流式下载大小。
每文件最大 URL 数 MAX_URLS_PER_SITEMAP 50,000 每个文档解析的最大 <url> 或 <sitemap> 记录数。
最大展开上限 MAX_EXPAND_URLS 1,000,000 递归展开索引时的全局 URL 累积上限。
最大 Loc 长度 MAX_URL_LEN 2,048 bytes RFC 7230 loc 长度上限,过长 URL 会被丢弃。
默认最大深度 max_depth 3 levels 嵌套 <sitemapindex> 文件的最大递归深度。

核心能力

1. 透明 Gzip 解压炸弹防护

Sitemap 经常使用 .xml.gz 压缩。恶意或损坏的 1 KiB gzip 文件可能在内存中膨胀为数十 GB。IndexFlow 通过受限的 flate2 reader(Take limiter)流式解压,超过 50 MiB 时立即以 SitemapError::DecompressionBomb 中止。

2. 不依赖前缀的 XML 解析

引擎严格按本地字节名称(Tag::from_local)评估标签,因此无论 XML 命名空间别名如何,都能一致提取内容。

3. 容错式 Ampersand 清理

IndexFlow 使用单遍清理器(sanitize_bare_ampersands)重写未转义的 ampersand,同时保留合法 XML 实体和 <![CDATA[...]]> 块。

4. 循环引用与环检测

展开 <sitemapindex> 层级时,IndexFlow 为每个 URL 计算规范身份 key;若当前分支已经访问过该 key,则记录并跳过,不使整个抓取失败。


Google 扩展提取

IndexFlow 将丰富的 Google sitemap 扩展元数据提取为结构化 Rust 模型:

1. 图片(<image:image>)

2. 视频(<video:video>)

3. 新闻(<news:news>)

4. Alternates 与 Hreflang(<xhtml:link>)


URL 区域与路径前缀提取

导入期间,SitemapService 解析 URL 路径和 hreflang 元数据来分类内容:

  • 区域提取:识别标准 ISO 639-1 语言前缀或使用声明的 xhtml:link 标签。
  • 路径前缀:分类根目录(如 /docs、/blog、/products),支持控制台中的本地化筛选。

执行 Sitemap 同步

通过 Web 控制台触发

进入 /sitemap 并点击 Sync Sitemap。

通过 REST API 触发

curl -X POST "https://www.indexflowing.com/docs/api/v1/pipeline/sitemap/start?site_id=1" \
  -H "Cookie: if_token=<YOUR_JWT_TOKEN>"

停止正在运行的同步

curl -X POST "https://www.indexflowing.com/docs/api/v1/pipeline/sitemap/stop?site_id=1" \
  -H "Cookie: if_token=<YOUR_JWT_TOKEN>"

数据库 Upsert 行为

发现的 URL 以每批 500 条的事务写入数据库。现有 URL 的 sitemap_lastmod、sitemap_synced_at 和 priority 会自动更新,同时保留历史审计日志。