安卓设备无法使用 RTE,苹果设备无法切换编辑器模式

对我来说,这听起来像个 bug,但如果是这样,我本该在这里看到相关的帖子。所以如果只有我的论坛出现这个问题,那肯定是我这边的问题。

总之。

我的安卓用户在使用富文本编辑器时看不到虚拟键盘。切换到 Markdown 后一切正常。iPad 和 iPhone(Safari/PWA、DiscourseHub)则卡在 Markdown 模式,无法切换到富文本编辑器。

我估计这个问题是两天前开始的。我的用户往往习惯先观察一阵,才会告诉我哪里出问题了。

还有什么呢……自托管,2 个容器,始终运行最新版本,每天自动升级,写作时最新版本才发布 20 分钟,开启安全模式也没用。

我下一步该怎么做?在移动设备上,查看控制台和可能的错误信息并不是一个可行的选项。

它们是存在的,但你需要将设备与笔记本电脑连接。

我用我的平板电脑(Android,问题与上述描述相同)做了这个操作,并看到:

(index):1 Access to script at 'https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js' from origin 'https://foorumi.katiska.eu' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
prosemirror-editor-opfbo6zd.digested.js:1  GET https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js net::ERR_FAILED 200 (OK)
d-editor.gjs:212 Uncaught (in promise) TypeError: Failed to fetch dynamically imported module: https://cdnfoorumi.katiska.eu/assets/br/prosemirror-editor-opfbo6zd.digested.js

Prosemirror 是富文本编辑器(RTEditor)。但我无法提供比分享我看到的错误信息更多的帮助。


题外话:感谢你的“亲吻与动物”分类带来的笑声(可惜英文翻译里写的是“猫”,所以我会坚持使用德语版本 :wink:

我添加了:

DISCOURSE_ENABLE_CORS: true

然后我引导了 web_only.yml 并在 CORS origins 中添加了 https://foorumi.katiska.euhttps://cdnfoorumi.katiska.eu

没有效果。

接着我执行了以下命令:

curl -sI -H 'Origin: https://foorumi.katiska.eu' 'https://cdnfoorumi.katiska.eu/assets/br/chunk-coedllgv.digested.js'

HTTP/2 403 
content-type: application/xml
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD
access-control-max-age: 3000
server: AmazonS3
date: Thu, 10 Sep 2026 14:13:35 GMT
x-cache: Error from cloudfront
via: 1.1 <characters>.cloudfront.net (CloudFront)
x-amz-cf-pop: HEL51-P1
x-amz-cf-id: <characters>

我不太明白这里显示的内容,但问题是否出在 S3 以及我在那里的设置上?如果是的话,为什么最近才出现这种情况?一个可能的症状是,从昨天起我就无法再编写任何 boards-notes 了。

但如果 CORS 是问题所在,为什么只有这些受到影响?


天哪,AI 在这种语境下居然用了 Küsse(亲吻),真是让人哭笑不得 :rofl:

我认为最近 Discourse 的更新不太可能导致这个问题。不过,S3 在 CORS 方面一直存在一个奇怪的行为,这可能导致 CDN 缓存了一个没有 Access-Control-Allow-Origin 头的资源版本。如果确实是缓存问题,这或许能解释为什么只有部分用户受到影响(很可能与他们的地理位置有关)。

据我所知,S3 只会向发送了 Origin 头的请求(即来自普通 Web 浏览器的请求)返回 Access-Control-Allow-Origin 头。当省略 Access-Control-Allow-Origin 时,S3 不会在响应中提供 Vary: origin。因此:如果对某个资源的首次请求来自非 Web 浏览器环境(例如 curl 或某些网络爬虫),CDN 就可能缓存那个没有 CORS 头的版本。这非常令人烦恼!

这里的 DISCOURSE_CORS 设置完全帮不上忙。该设置仅与应用服务器相关,与 S3 无关。

在我们的托管环境中,我们通过配置 Cloudfront 在所有响应中添加 Access-Control-Allow-Origin: * 来规避这个问题。这样可以确保 S3 的这种奇怪行为不会导致缓存了错误的结果。

或者,你可以配置 Cloudfront 将 Origin 请求头包含在其缓存键中,这样就能将非 CORS 响应与 CORS 响应区分开来。

亚马逊在 这里 提供了大量关于 CORS 的文档。我的笔记里还有 这个链接,它显然是一个专门讨论此问题的论坛帖子……但看起来它已经被删除了 :cry:

但我不使用 Cloudfront,所以这一定是来自 AWS 的吗?

你确定吗?:eyes:

❯ host cdnfoorumi.katiska.eu
cdnfoorumi.katiska.eu is an alias for djpzno7cbajfp.cloudfront.net.

编辑:为了澄清,我们这里讨论的是 AWS CloudFront,而不是 Cloudflare(这两个名字非常相似!:sweat_smile:)

是的,确实如此——我确实在用 AWS CloudFront :laughing: 如果我没记错的话,需要使用自己的域名。或者大概是这样吧。

没错,自定义域名是必需的,而且这样还能降低成本(据我所知,Cloudfront 的出站流量费用比直接从 S3 出站要便宜)。

Olipa urakka.

首先,我从 web_only.yml 文件中删除了所有 S3 引用。然后执行了 rebuild,并且为了保险起见运行了 rake posts:rebake。问题消失了,但图片仍然通过 CDN 加载。我恢复了 S3,问题又回来了。

我打开了 AWS,查看了 CloudFront 的 distribution 设置。那里至少有一个三年前的域名,其 TLD 已经改变了。我真的很奇怪,为什么任何东西还能正常工作。我按照 CloudFront 的建议修改了设置,并在某个地方设置了 access-control-allow-origin: *(这很愚蠢,因为它让 CORS 变得毫无意义)。不过据我理解,这个 header 本来就已经通过 CloudFront 提供了。

为了保险起见,再次 rebuild 并进行测试。没有用。

由于可能是缓存出了问题,我失效了 /assets/*,并且为了保险起见也失效了 /assets/br/*。再次 rebuild 后,问题解决了。

另一个问题也解决了。从夏天开始,我在 rebuild 后一直遇到 Oops… 即 50x 错误。当我开启安全模式并禁用主题时,我可以进入管理后台。我必须禁用多个 TC(大约 20 多个),论坛才能恢复正常。然后我可以重新启用这些组件,一切又恢复正常了。

那么,我们是否可以得出结论,说所有问题都源于 AWS CloudFront 的问题?