从 2.4.0.beta9 更新至 2.4.0.beta10 导致页面无内容 - Cloudflare Rocket Loader

今天早上我收到了一封关于一键浏览器升级的电子邮件通知,我像往常一样进行了操作。升级完成后返回论坛,我只看到一个空白页面,其中包含预期的背景图和头部图像,但没有其他内容。

切换到 /var/discourse 目录并运行 ./launcher rebuild app 命令后,命令按预期执行,但论坛网站的行为仍然相同(显示头部图像和背景,无内容)。

请帮忙解决?

如果查看源代码,看起来至少部分内容是存在的……只是不可见。从 2.4.0.beta9 到当前版本,这些内容未作任何更改。

您的浏览器控制台中是否有任何错误?(右键点击,检查元素,然后转到控制台选项卡)

是的:

拒绝加载脚本 ‘https://ajax.cloudflare.com/cdn-cgi/scripts/7089c43e/cloudflare-static/rocket-loader.min.js’,因为它违反了以下内容安全策略指令:“script-src ‘report-sample’ https://forums.stillwellaudio.com/logs/ https://forums.stillwellaudio.com/sidekiq/ https://forums.stillwellaudio.com/mini-profiler-resources/ https://forums.stillwellaudio.com/assets/ https://forums.stillwellaudio.com/brotli_asset/ https://forums.stillwellaudio.com/extra-locales/ https://forums.stillwellaudio.com/highlight-js/ https://forums.stillwellaudio.com/javascripts/ https://forums.stillwellaudio.com/plugins/ https://forums.stillwellaudio.com/theme-javascripts/ https://forums.stillwellaudio.com/svg-sprite/ https://www.google-analytics.com/analytics.js”。请注意,未明确设置 ‘script-src-elem’,因此使用 ‘script-src’ 作为后备。

20 资源 使用 link preload 进行了预加载,但在窗口加载事件后的几秒内未被使用。请确保它具有适当的 as 值,并且是有意进行预加载的。

Cloudflare 的 JavaScript“优化”经常导致 Discourse 站点出现问题。您应登录您的 Cloudflare 账户,将论坛域名从“橙色云”更改为“灰色云”。

修复起来很简单,谢谢。有点可惜,因为这绕过了 Cloudflare 所有的 DDoS 防护和 IP 地址隐藏功能,但修改后确实起作用了。我会联系 Cloudflare 的支持团队来报告这个问题。

我认为 Cloudflare 自动能做的并不多。这里有说明,介绍如何在 CSP 中允许 Rocket Loader。不过,Discourse 的 JavaScript 已经经过高度优化,因此并不需要 Rocket Loader。

已确认:禁用 Rocket Loader 并重新启用代理同样有效。这是一个很好的折中方案,谢谢!

需要说明的是,你不必关闭橙色云朵图标,也可以保持开启,并通过页面规则为整个站点“禁用性能优化”。

他们的 DDoS 防护与优化功能是相互独立的。

不过,保持云朵开启会减慢每个请求的速度——因此,除非你确实需要 DDoS 防护或希望使用他们的 CDN,否则最好将其禁用。

我使用了 Argo 智能路由以及 Cloudflare 的其他性能优化功能。一般来说,它们确实能显著提升性能,尤其是针对该域名下的主网站,而非论坛部分。不过,主网站才是让用户购买我产品的关键,速度越快越好。总之,关闭 Rocket Loader 这一特定优化项后,Discourse 就能在代理环境下正常运行,这是一个不错的折中方案。谢谢!

升级到 2.4.0 beta 10 后出现类似问题

我同时拥有 https://www 版本和 https://(不带 www)版本。

https://www 版本运行正常。

https://(不带 www)版本在 Chrome 和 Safari 中显示为空白,且控制台中有大量错误。

拒绝加载脚本 ‘’,因为它违反了以下内容安全策略(Content Security Policy)指令:“script-src ‘report-sample’ ”。注意:未显式设置 ‘script-src-elem’,因此使用 ‘script-src’ 作为回退。

拒绝加载脚本 ‘https://dastereo.ru/assets/locales/ru-2fae24b4e1db72deb2076bee15794ed9e0a6814a5bf52d778e29c106812aaa6c.js’,因为它违反了以下内容安全策略指令:“script-src ‘report-sample’ https://www.dastereo.ru/logs/ https://www.dastereo.ru/sidekiq/ https://www.dastereo.ru/mini-profiler-resources/ https://www.dastereo.ru/assets/ https://www.dastereo.ru/brotli_asset/ https://www.dastereo.ru/extra-locales/ https://www.dastereo.ru/highlight-js/ https://www.dastereo.ru/javascripts/ https://www.dastereo.ru/plugins/ https://www.dastereo.ru/theme-javascripts/ https://www.dastereo.ru/svg-sprite/ https://www.google-analytics.com/analytics.js”。注意:未显式设置 ‘script-src-elem’,因此使用 ‘script-src’ 作为回退。

有没有简单的解决方法?

不支持同时在两个域名上运行网站。你可以通过禁用内容安全策略(Content Security Policy)来解决这个特定错误,但我不推荐这样做。

最好的办法是将其中一个域名重定向到另一个域名。

您是否也在使用 Cloudflare?如果是,您可以使用两条页面规则来重定向:

http://example.com/* :right_arrow: https://example.com/$1
https://example.com/* :right_arrow: https://www.example.com/$1