哇,这趟折腾可真是够呛。我基本上重新配置了我的整个 Cloudflare R2 对象存储和 Discourse 实例,而且我觉得这个 Bug 确实跟 R2 有关。当我修复了 Cloudflare DNS 记录并重建实例,使 DISCOURSE_CDN_URL 真正指向它时,结果搞坏了一堆其他东西,比如翻译字符串,还在控制台里抛出了多个错误,包括一些 CORS 错误。这让我今天钻了好多死胡同。所以看来使用 DISCOURSE_CDN_URL 似乎与 Cloudflare R2 不兼容。(这真的很奇怪——当我最初设置原始 DNS 条目时,我错误地输入了 cdn.mysite.com 的 DNS 记录,导致它解析成了 cdn.mysite.com.mysite.com)。正确设置 DISCOURSE_CDN_URL 似乎与 Cloudflare R2 对象存储不兼容。这里可能还有一些我没完全搞懂的地方。
总之,当我用我的 PR 分支重新构建时,一切都修好了,因为它将赋值包裹在 Discourse.store.cdn_url() 中,使得自定义表情包的上传遵循与标准帖子图片上传相同的 S3 CDN 路由和回退逻辑。
我重新打开了 PR 并编辑了描述。不过我想如果 Discourse 团队选择不合并它,那也没关系,因为主题组件在客户端层面修复了这个问题。请注意,PR 中的修复应仅影响 R2 对象存储配置中的自定义表情包,而不影响其他常规的 S3 兼容服务,如 AWS。