对于添加了自定义表情的站点,修复合并后,聊天中的表情现在会失效。
与标准帖子图片不同(可以通过运行 rake posts:rebake 修复),聊天自定义表情是通过 /site.json 动态传递给前端的。
如果你的数据库中包含缺少协议的 S3 URL(例如 //bucket.endpoint...),或者使用了虚拟主机风格域名且该域名与你的 app.yml 环境变量不完全匹配,Discourse 的内部 CDN 替换器会静默失败。原始的存储桶 URL 会被传递给浏览器,从而导致聊天中的自定义表情失效。
如何修复:
要永久修复此问题,你需要在数据库中强制将原始存储桶 URL 映射到你的 CDN URL,然后清除站点缓存,以便 /site.json 重新生成。
1. 进入容器:
SSH 登录到你的服务器并进入 Discourse 容器(通常是 app,如果你使用双容器设置,则是 web_only)。
cd /var/discourse
./launcher enter app
2. 重新映射 URL:
运行内置的 Discourse remap 工具。你应该运行两次,以捕获 https:// 变体以及迁移脚本有时会遗留的无协议 // 变体。
将占位符替换为你的实际原始存储桶 URL 和实际 CDN URL:
# 修复标准的 https:// URL
discourse remap "https://<your-bucket>.<your-endpoint>.com" "https://cdn.your-domain.com"
# 修复无协议的 // URL(这通常是导致自定义表情失效的原因)
discourse remap "//<your-bucket>.<your-endpoint>.com" "https://cdn.your-domain.com"
3. 清除缓存
由于 /site.json 被高度缓存,你必须清除 Rails 缓存以强制论坛提供新的 URL:
打开 Rails 控制台:
rails c
运行以下命令:
Rails.cache.clear
Site.clear_cache
exit
4. 刷新
硬刷新你的浏览器(如果仍在使用,请禁用主题组件的临时解决方案)。聊天中的自定义表情现在应该已修复,并通过 CDN 正常加载。