TL;DR: 无论我在嵌入设置中允许哪些主机,Discourse 都会显示“嵌入错误”。
我在 foo.com 上发布了一个网站,该网站嵌入了来自 forum.foo.com 的 Discourse 论坛评论,目前运行正常。例如,访问 https://foo.com/blog/2019-11-22/foo-0.9.6-released 时,嵌入的评论显示正常。在这种情况下,页面源代码中的嵌入脚本代码如下:
<div id='discourse-comments'></div>
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' };
(function() {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
})();
</script>
我还在本地机器上运行了一个开发版本的网站(localhost),但在嵌入方面遇到了问题——它一直显示“嵌入错误”,而不是在论坛生成并返回的 HTML 中显示评论。也就是说,在嵌入区域的右上角,我看到了论坛的标志和指向它的链接,但评论列表并未出现,取而代之的是该错误消息。
例如,访问 http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/(这是生产站点的等效页面)时,页面源代码中的嵌入脚本代码如下:
<div id='discourse-comments'></div>
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/' };
(function() {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
})();
</script>
我尝试过在 discourseEmbedUrl 设置中保留或不保留末尾的斜杠 /,但没有任何区别。
我无法直接访问运行论坛的服务器,但我已进入论坛的管理面板,并尝试在嵌入设置中添加多个允许的主机。当前针对正常工作的生产站点的设置如下:
“允许的主机”、“类名”、“路径白名单”、“发布到分类”
foo.com, <空>, /blog/.*, blog
为了让本地开发版本的 localhost 站点也能正常工作,我添加了以下内容:
“允许的主机”、“类名”、“路径白名单”、“发布到分类”
localhost, <空>, /blog/.*, blog
localhost:1313, <空>, /blog/.*, blog
<论坛服务器看到的我的外部/公共 IP 地址>, <空>, /blog/.*, blog
<论坛服务器看到的我的外部/公共 IP 地址>:1313, <空>, /blog/.*, blog
但这些设置均无效,我仍然收到相同的“嵌入错误”消息。
我不太想深入源代码进行调试,更希望了解 Discourse 在决定生成该错误消息时究竟检查了哪些内容。有人能告诉我这一点以及如何解决吗?这应该相当直接,但 Discourse 在这里表现得像个黑盒。
我已经阅读了 Embed Discourse comments on another website via Javascript 的全部内容,但其中并未提供更多有用的信息。

