Invalid relative Markdown image paths are repeatedly retried and block knowledge indexing

该报错发生在 Dify 知识库流水线处理包含无效相对路径 Markdown 图片引用时。优先排查方向:核对待处理文档中的图片引用是否包含非绝对 HTTP(S) 协议路径,以及知识库流水线中 Markdown 文档的上传清单。核心英文报错为: Invalid relative Markdown ima

快速结论:该报错发生在 Dify 知识库流水线处理包含无效相对路径 Markdown 图片引用时。优先排查方向:核对待处理文档中的图片引用是否包含非绝对 HTTP(S) 协议路径,以及知识库流水线中 Markdown 文档的上传清单。核心英文报错为:Invalid relative Markdown image paths are repeatedly retried and block knowledge indexing

适用环境:Dify 1.16.1(Self-hosted Kubernetes/Helm 部署,容器镜像基于 Dify 1.16.1);已确认场景使用 Docker 自托管部署。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的代码修改(在 _download_image 前增加 URL scheme 校验、下载前先去重)属于社区建议,尚未在 Issue 内提供经过验证的补丁或官方修复版本。

注意事项:此问题核心是处理包含大量相对路径图片引用的 Markdown 文档(如 9.35 MB、1772 个引用、886 个唯一路径)时,会触发完整的重试机制,阻塞队列。若需临时规避,可等待官方修复或考虑在上述代码修复合入前,先检查并预处理上传文档中的无效图片引用。

问题场景

用户在 Dify 知识库流水线中,通过本地文件数据源上传包含无效或不可用相对路径图片引用的 Markdown 文档。流水线包含本地文件数据源、Dify Extractor、父子分块节点、知识库输出节点。问题触发于处理大量(1,772 个)引用、且所有图片路径均为相对且不可用(缺失 http://https:// 协议)的 Markdown 文档场景。

报错原文

Request to URL document_images/<image>.jpg failed on attempt 1:
Request URL is missing an 'http://' or 'https://' protocol.

Request to URL document_images/<image>.jpg failed on attempt 2:
Request URL is missing an 'http://' or 'https://' protocol.

Request to URL document_images/<image>.jpg failed on attempt 3:
Request URL is missing an 'http://' or 'https://' protocol.

Request to URL document_images/<image>.jpg failed on attempt 4:
Request URL is missing an 'http://' or 'https://' protocol.

MaxRetriesExceededError:
Reached maximum retries (3) for URL document_images/<image>.jpg

原因分析

可能原因:IndexProcessorBase._get_content_files() 处理 Markdown 图片引用时,会先匹配 Dify 内部文件 URL 模式(如 /files/.../file-preview)。未匹配到内部模式的图片引用全部落入 _download_image() 分支,而该方法在发起 SSRF 代理请求前,没有校验目标 URL 是否为绝对 HTTP(S) 地址。无效相对路径在 SSRF 代理层触发最多 3 次重试(指数退避 0.5 秒、1 秒、2 秒)后才抛出 MaxRetriesExceededError。此外,下载循环没有预先去重,相同无效路径的重复出现会再次触发请求尝试。在单并发 Celery worker 场景下,后续文档会持续处于 Queuing 状态。

环境排查

  • Dify 版本是否为 1.16.1(或其他版本)
  • 上传 Markdown 文档中的图片引用是否包含绝对 http://https:// 协议
  • 图片引用是否被识别为 Dify 内部文件 URL(/files/.../file-preview 等模式)
  • 文档中图片引用总量及唯一路径数量
  • Celery worker 并发配置(是否单并发)
  • 相关底层文件:index_processor_base.pyremote_fetcher.py、SSRF 代理配置

解决步骤

  1. 代码层修复建议(可优先尝试):在 api/core/rag/index_processor/index_processor_base.py 中,在 if current_user: 的回退分支前增加 URL scheme 校验。使用模块已导入的 urlparse 判断图片引用是否为绝对 HTTP(S) URL,非 HTTP(S) 或缺少 netloc 的引用跳过并记录 WARNING 日志。
  2. 下载前先去重(可优先尝试):在下载循环之前对图片 URL 进行去重,循环结束后恢复重复项以保持 SegmentAttachmentBinding 计数正确。
  3. 临时规避方案:在上传前预处理 Markdown 文档,确保所有图片引用为有效的绝对 HTTP(S) URL,或直接移除文档中无效的相对图片引用。
  4. 等待官方修复:该问题需要官方合入代码补丁解决,可关注 Issue #41332 后续状态和 Dify 新版本发布。

验证方法

确认修复是否有效:上传包含大量无效相对图片引用的 Markdown 文档,观察 worker 日志不再出现大量 Request URL is missing an 'http://' or 'https://' protocol. 报错;文档创建和索引处理时间恢复正常范围;在单并发 Celery worker 场景下,后续上传的文档不再长时间处于 Queuing 状态。

参考来源

langgenius/dify #41332

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注