TL;DR: Discourse выдаёт «Error Embedding» независимо от того, какие хосты я добавляю в настройки встраивания. У меня есть опубликованный сайт на foo.com, который встраивает комментарии с форума Discourse на forum.foo.com — это работает отлично. При переходе, например, на 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, генерируемом и возвращаемом форумом, постоянно появляется сообщение «Error Embedding». То есть в области встраивания в правом верхнем углу я вижу логотип форума и ссылку на него, но вместо списка комментариев отображается только это сообщение об ошибке.
При переходе, например, на 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, так и без него — разницы нет.
У меня нет прямого доступа к серверу, на котором работает форум, но я зашёл в админ-панель форума и попытался добавить несколько разрешённых хостов в настройках встраивания. Текущие настройки для работающего продакшн-сайта следующие:
«Allowed Hosts», «Class Name», «Path Whitelist», «Post to Category»
foo.com, <пусто>, /blog/.*, blog
Что я добавил, чтобы это заработало для моей локальной тестовой версии сайта:
«Allowed Hosts», «Class Name», «Path Whitelist», «Post to Category»
localhost, <пусто>, /blog/.*, blog
localhost:1313, <пусто>, /blog/.*, blog
<мой внешний/публичный IP-адрес, видимый сервером форума>, <пусто>, /blog/.*, blog
<мой внешний/публичный IP-адрес, видимый сервером форума>:1313, <пусто>, /blog/.*, blog
Но ничего из этого не помогло — я всё равно получаю то же сообщение «Error Embedding».
Мне не хочется лезть в исходный код и пытаться отлаживать это вручную; я бы предпочел получить информацию о том, что именно проверяет Discourse при принятии решения о генерации этого сообщения об ошибке. Может ли кто-нибудь объяснить это и подсказать, как исправить проблему? Это должно быть довольно просто, но Discourse ведёт себя здесь как чёрный ящик.
Я прочитал всю статью Embed Discourse comments on another website via Javascript, но там нет более полезной информации.

