你好,我正在尝试按照嵌入指南将 Discourse 评论嵌入到我的网站中,但遇到了瓶颈 ![]()
症状
我在 Firefox 和 Chrome 中都进行了尝试。在这两种情况下,页面都会加载显示“正在加载讨论…"的 Discourse iframe,但随后卡住,开发者控制台中出现重复的 JavaScript 错误。
在 Firefox 中,我收到了关于 X-Frame-Options 的错误:
加载“https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927”时发现无效的 X-Frame-Options 头:“ALLOWALL”不是有效的指令。
随后在 embed-application.js:7 中出现 DOMException 错误:
未捕获的 DOMException:指定了无效或非法的字符串
这两个错误大约每 30 秒重复一次。网络标签页中没有失败的请求。
在 Chrome 中,我没有收到 X-Frame-Options 错误。几秒钟后,我收到了关于目标源与接收窗口源不匹配的错误:
在 'DOMWindow' 上执行 'postMessage' 失败:提供的目标源 ('https://discourse.29th.local') 与接收窗口的源 ('https://personnel.29th.local') 不匹配。
我在 meta 上看到了很多关于此错误的主题,并尝试了所有故障排除步骤,但均无济于事。
我的环境设置
我遵循了Discourse for Mac 设置指南,但有一个小例外:我没有在笔记本电脑上全局安装 postgres、redis 和 mailcatcher,而是让它们在 Docker 容器中运行,并公开了端口。Discourse 并不知道它们是在 Docker 容器中运行而不是在裸机上运行。Rails/Discourse 是全局安装的,并没有在 Docker 容器中运行。
完全独立地,我的自定义 Web 应用程序运行在一个 Docker Compose 栈中。该栈的一部分包括一个 nginx 服务器,它将 personnel.29th.local 路由到适当的上游容器,将 discourse.29th.local 路由到 host.docker.internal:3000(这是 Docker 容器用来访问主机 localhost 的魔法主机名)。
(正如我在下面提到的,我已经从方程中移除了 nginx 层,但得到了相同的错误)
这里的一个可能陷阱是,我的 Web 应用是一个 JavaScript 单页应用(SPA)。嵌入 Discourse 评论的页面是 https://personnel.29th.local/#enlistments/1234,并且没有服务器端渲染。如果这是一个问题,我期望会出现关于爬虫的错误,那时我就接受 Discourse 仅仅链接到我的应用而不是爬取它。但它显示的错误似乎与爬取失败无关。
故障排除
我已在 管理 > 自定义 > 嵌入 中将可嵌入主机设置为 personnel.29th.local。起初,示例嵌入代码显示 discourseUrl 为 http://localhost:3000/,所以我启动了 rails console 并运行:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
并在管理仪表板中开启了“强制 HTTPS"。这修复了示例嵌入代码中的 URL。
我还在设置的 cors origins 部分添加了 https://personnel.29th.local 作为 CORS 域。
我现在使用以下命令启动 Discourse:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
我还尝试在设置仪表板中禁用内容安全策略(CSP)。
我查看了 https://discourse.29th.local/logs/,但没有看到任何错误,也没有关于 Sidekiq 的信息。
关于 Sidekiq,我在管理仪表板上确实看到一条关于更新的消息:
尚未执行更新检查。请确保 Sidekiq 正在运行。
因此,我在 rails console 中运行了 Sidekiq.redis { |r| puts r.flushall } 并得到了 OK,重启了 rails 服务器,但消息和整体问题都没有改变。我在 redis 缓存中四处查看,没有发现与此页面相关的内容。
我还试图通过移除 nginx 层来简化问题:将 SiteSetting.force_hostname 和 SiteSetting.port 恢复为 nil,关闭强制 HTTPS,通过 localhost 访问我的 Web 应用和 Discourse,并将我的 Web 应用添加到 Discourse 的可嵌入主机和 CORS 主机名(http://localhost:8080),但我得到了相同的错误,只是主机不同:
在 'DOMWindow' 上执行 'postMessage' 失败:提供的目标源 ('http://localhost:3000') 与接收窗口的源 ('http://localhost:8080') 不匹配。
我运行的版本是 2.6.0.beta6 (60bc38e6a8),我是按照 Discourse for Mac 设置指南在几周前克隆 master 分支,并在今天运行 git pull origin master 获取的。
我还删除了 tmp 目录并重启了服务器。
我还出去散了散步,对着枕头大喊,并在桌下哭了一场。
希望这涵盖了所有方面。希望能有人提供帮助!
