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

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

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

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

快速结论:当 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
文章: 7669

发表回复

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