Reverse proxies such as nginx may automatically decode urls, resulting in routes not being matched correctly

用户在 ComfyUI 后端使用包含中文字符(如文件名“啥.json”“行.json”)的路径发起 API 请求时,请求经过 Nginx 反向代理后出现 400 错误,aiohttp 报错提示 URL 路径中检测到非法字符。

快速结论:当 ComfyUI 通过 Nginx 反向代理对外提供服务时,Nginx 可能会自动解码 URL 中的中文字符(UTF‑8 编码),导致 URL 路径中的非 ASCII 字符被原样传递,aiohttp 无法解析并抛出 InvalidURLError 错误。优先排查 Nginx 配置中的 proxy_pass 是否缺少 $request_uri 或使用了错误的代理 URL 传递方式。

问题场景

用户在 ComfyUI 后端使用包含中文字符(如文件名“啥.json”“行.json”)的路径发起 API 请求时,请求经过 Nginx 反向代理后出现 400 错误,aiohttp 报错提示 URL 路径中检测到非法字符。

报错原文

Error handling request from 127.0.0.1
Traceback (most recent call last):
  File "/home/aistudio/sd-comfyui/venv/lib/python3.10/site-packages/aiohttp/web_protocol.py", line 382, in data_received
    messages, upgraded, tail = self._request_parser.feed_data(data)
  File "aiohttp/_http_parser.pyx", line 558, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.InvalidURLError: 400, message:
  Invalid char in url path:

    b'POST /api/userdata/workflows/\xe5\x95\xa5.json?overwrite=false&full_info=true HTTP/1.1'
                                   ^

(or similar lines for GET/POST requests containing UTF‑8 encoded characters such as \xe8\xa1\x8c.json)

原因分析

Nginx 在默认的 proxy_pass 配置中(如 proxy_pass http://comfyui_backend;),会将原始请求的 URI 进行解码后转发。如果原始 URL 中包含 UTF‑8 编码的中文字符(例如“啥.json”),Nginx 可能将其解码为裸 UTF‑8 字节(如 \xe5\x95\xa5)传递给后端,而 aiohttp 的 HTTP 解析器认为这些字节在 URL 路径中是无效字符,从而直接返回 400 错误。这可能并非 aiohttp 的问题,而是 Nginx 解码行为导致的请求路径格式错误。

环境排查

  • 确认 ComfyUI 是否通过 Nginx 反向代理(或其他类似代理)对外暴露服务。
  • 检查 Nginx 配置中 proxy_pass 是否使用了变量(如 $request_uri)或使用了不带 URI 处理的简单 proxy_pass
  • 确认请求路径中是否包含中文字符、空格或其他非 ASCII 字符。
  • 检查 ComfyUI 版本(建议升级到最新版获取可能的修复)。

解决步骤

  1. 修改 Nginx 配置:确保 proxy_pass 指向的 URL 不重新拼接路径,而是直接使用客户端原始请求 URI。推荐配置为:
    location / {
        proxy_pass http://comfyui_backend$request_uri;
    }

    proxy_pass 后面加 $request_uri 变量,这样会将未解码的原始 URI 直接传递给后端,避免 Nginx 自动解码导致的问题。

  2. 如果不想使用 $request_uri,也可尝试在 Nginx 中设置:
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    # 不额外处理 URI,保持原始路径

    $request_uri 是更可靠的解决方案。

  3. 如果问题仍然存在,检查 aiohttp 版本,确认是否为已知 bug。该问题在 Issue 讨论中的解决方案是通过修改 Nginx 配置解决的。

验证方法

修改 Nginx 配置后,重新加载或重启 Nginx(如 nginx -s reload)。再次通过代理访问包含中文字符的 URL(例如 GET /api/userdata/workflows/啥.json),观察是否不再返回 400 错误,并能正常获取数据。也可以在 ComfyUI 日志中确认没有新的 InvalidURLError 出现。

参考来源

Comfy-Org/ComfyUI #7349

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18313

发表回复

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