# 从 S3/R2 加载的自定义表情符号绕过 CDN 路由

**URL:** <https://meta.discourse.org/t/custom-emojis-loaded-from-s3-r2-bypass-cdn-routing/406384>\
**Category:** Bug\
**Tags:** emoji, cdn, s3, fixed\
**Created:** [2026年六月29日 19:50 UTC](https://meta.discourse.org/t/custom-emojis-loaded-from-s3-r2-bypass-cdn-routing/406384 "2026-06-29T19:50:56Z")\
**Posts on this page:** 1\
**Showing post:** 11

<div class="post-metadata">

**Author:** ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)\
**Post date:** [2026年七月1日 00:26 UTC](https://meta.discourse.org/t/custom-emojis-loaded-from-s3-r2-bypass-cdn-routing/406384/11 "2026-07-01T00:26:16Z")

</div>

哇，这趟折腾可真是够呛。我基本上重新配置了我的整个 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。

---

_[View the full topic](https://meta.discourse.org/t/custom-emojis-loaded-from-s3-r2-bypass-cdn-routing/406384)._
