
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 版本(建议升级到最新版获取可能的修复)。
解决步骤
- 修改 Nginx 配置:确保
proxy_pass指向的 URL 不重新拼接路径,而是直接使用客户端原始请求 URI。推荐配置为:location / { proxy_pass http://comfyui_backend$request_uri; }即
proxy_pass后面加$request_uri变量,这样会将未解码的原始 URI 直接传递给后端,避免 Nginx 自动解码导致的问题。 - 如果不想使用
$request_uri,也可尝试在 Nginx 中设置:proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 不额外处理 URI,保持原始路径但
$request_uri是更可靠的解决方案。 - 如果问题仍然存在,检查 aiohttp 版本,确认是否为已知 bug。该问题在 Issue 讨论中的解决方案是通过修改 Nginx 配置解决的。
验证方法
修改 Nginx 配置后,重新加载或重启 Nginx(如 nginx -s reload)。再次通过代理访问包含中文字符的 URL(例如 GET /api/userdata/workflows/啥.json),观察是否不再返回 400 错误,并能正常获取数据。也可以在 ComfyUI 日志中确认没有新的 InvalidURLError 出现。



