启用“禁止匿名用户下载文件”时,“/uploads/”中的主题资源无法加载

当主题组件在其 about.json 中声明资源时,Discourse 会将它们存储在 /uploads/ 下并提供服务。
如果启用了站点设置“阻止匿名用户下载文件”,则这些主题资源对于匿名用户会返回 404,因为它们被视为受保护的上传文件。
这可能会破坏任何动态加载自身 JavaScript 的主题或组件——例如,“主题列表预览”组件。


重现步骤

  1. 安装“主题列表预览”组件(https://github.com/merefield/discourse-tc-topic-list-previews)。
  2. 验证它是否能正确加载给已登录和匿名用户。
  3. 启用站点设置“阻止匿名用户下载文件”。
  4. 以未登录用户身份访问论坛主页,并检查浏览器控制台。

观察到的行为

  • 对文件的请求,例如

    /uploads/default/original/1X/d8ce366bd7aad8f9fc7b26b08aecc855dd6d425c.js
    

    返回 404 Not Found(实际上是一个 HTML 错误页面)。

  • 浏览器控制台显示:

    Refused to execute script ... because its MIME type ('text/html') is not executable
    
  • 依赖该文件的组件(例如,主题列表预览中的 preview-edits.gjs)未能运行,导致布局问题。


预期行为

about.json 中定义的主题资源应始终公开可访问,无论“阻止匿名用户下载文件”设置如何。
它们是静态资源,不是用户上传的文件,不应继承上传文件的访问限制。


技术细节

  • Discourse 版本:3.6.0.beta2 (最新)

  • 组件:“主题列表预览”(https://github.com/merefield/discourse-tc-topic-list-previews

  • 相关的 about.json 片段:

    "assets": {
      "imagesloaded": "assets/imagesloaded.js"
    }
    
  • 在主题安装期间,Discourse 会将此文件存储为 /uploads/default/original/... 下的 Upload

  • 启用匿名限制会导致 Discourse 阻止对该路径的请求,即使它是主题资源。


建议的解决方案

通过 about.json 上传的主题资源应:

  • 从专用路径(例如 /theme-assets//assets/)提供服务
  • 豁免“阻止匿名用户下载文件”的限制。

影响

这会影响任何依赖客户端动态加载的主题资源(JS/CSS/图片)的主题或组件。
当匿名下载限制开启时,会破坏匿名访问者主要 UI 组件的功能。

3 个赞

感谢您如此详细的描述,我同意在这里做些什么是有意义的。

1 个赞

我不认为这仅限于主题资源。启用该设置似乎还会破坏匿名用户的网站徽标、网站图标等。该实现完全阻止了匿名用户访问 /uploads/*

@lhkjacky,您的网站对匿名用户来说徽标也显示不正常吗?

1 个赞