当主题组件在其 about.json 中声明资源时,Discourse 会将它们存储在 /uploads/ 下并提供服务。
如果启用了站点设置“阻止匿名用户下载文件”,则这些主题资源对于匿名用户会返回 404,因为它们被视为受保护的上传文件。
这可能会破坏任何动态加载自身 JavaScript 的主题或组件——例如,“主题列表预览”组件。
重现步骤
- 安装“主题列表预览”组件(
https://github.com/merefield/discourse-tc-topic-list-previews)。 - 验证它是否能正确加载给已登录和匿名用户。
- 启用站点设置“阻止匿名用户下载文件”。
- 以未登录用户身份访问论坛主页,并检查浏览器控制台。
观察到的行为
-
对文件的请求,例如
/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 组件的功能。