Regression: user.css is no longer applied because /api/userdata/user.css is served as attachment

ComfyUI 回归问题: user.css 因服务器返回 Content-Disposition: attachment 导致 Chromium/Electron 拒绝将其作为样式表加载。优先检查 app/user_manager.py 中 getuserdata() 是否对 CSS 文件误加了附

快速结论:ComfyUI 回归问题:user.css 因服务器返回 Content-Disposition: attachment 导致 Chromium/Electron 拒绝将其作为样式表加载。优先检查 app/user_manager.pygetuserdata() 是否对 CSS 文件误加了附件头。

适用环境:ComfyUI(后端),影响 ComfyUI Desktop(Chromium/Electron 环境)。Python 版本未明确,但涉及 aiohttpweb.FileResponse

最快修复方案:暂无官方一步修复;临时方案:手动修改 app/user_manager.py,在 getuserdata() 中对 user.css 移除 Content-Disposition: attachment 头。示例代码(来源 Issue 正文):

if os.path.basename(path) == "user.css":
    return web.FileResponse(
        path,
        headers={
            "Content-Type": "text/css",
            "X-Content-Type-Options": "nosniff",
        },
    )

注意事项:此修改需自行编辑后端代码,恢复后会降低对任意文件上传的存储型 XSS 防护(原 attachment 头是安全缓解措施)。官方可能在未来版本中通过前端侧修正,请关注相关 PR(如 #15000)更新。

问题场景

用户创建 user/default/user.css 并添加自定义样式后,ComfyUI 桌面端前端无法应用该样式表,但网络请求显示 HTTP 200 成功。

报错原文

Regression: user.css is no longer applied because /api/userdata/user.css is served as attachment
Content-Disposition: attachment
X-Content-Type-Options: nosniff

原因分析

可能原因是 ComfyUI 的后端 app/user_manager.py 中的 getuserdata() 函数对所有通过 /api/userdata/ 返回的文件都设置了 Content-Disposition: attachment 头(作为存储型 XSS 缓解措施)。Chromium/Electron 检测到此头后,将 CSS 文件视为下载附件,不再将其作为样式表解析,导致 user.css 被忽略。此行为在 #14734 引入回归(见关联 PR #15000)。

环境排查

  • 确认是否使用 ComfyUI Desktop(Chromium/Electron 环境),或其他基于 Electron 的浏览器包装器。
  • 检查后端版本是否包含 #14734 或之后的安全修复。
  • 非必需:user.css 文件路径是否正确(默认 user/default/user.css)。

解决步骤

  1. 定位 app/user_manager.py 文件(通常在 ComfyUI 安装目录下)。
  2. 找到 getuserdata() 函数,查找类似以下代码块:
    return web.FileResponse(path, headers={
        "Content-Type": content_type,
        "X-Content-Type-Options": "nosniff",
        "Content-Disposition": "attachment",
    })
  3. 将上述代码替换为条件分支(参考 Issue 正文中的建议修复,注意保留对非 CSS 文件的 attachment 头):
    if os.path.basename(path) == "user.css":
        return web.FileResponse(
            path,
            headers={
                "Content-Type": "text/css",
                "X-Content-Type-Options": "nosniff",
            },
        )
    else:
        return web.FileResponse(path, headers={
            "Content-Type": content_type,
            "X-Content-Type-Options": "nosniff",
            "Content-Disposition": "attachment",
        })
  4. 保存文件,重启 ComfyUI 后端。

验证方法

在浏览器或 ComfyUI Desktop 中打开开发者工具(F12),查看网络请求 /api/userdata/user.css 的响应头。确认 Content-Disposition 消失或变为 inline。检查页面元素是否已应用 user.css 中的样式(如测试用的 body { background: red !important; })。

参考来源

Comfy-Org/ComfyUI #15071

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15208

发表回复

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