Кроме того, новые комментарии Discourse перестали отображаться в нашем виджете на сайте Drupal. Мы успешно использовали приведённые ниже инструкции по внедрению через JavaScript в течение многих лет:
Однако, по какой-то причине это перестало работать в последнее время. Я полагаю, что последний рабочий пост был примерно 1-го числа этого месяца. Старые посты отображаются как в Discourse, так и в модуле внедрения, но в новых недавних статьях блок Discourse зависает на тексте «Загрузка…».
Наш модуль Discourse для Drupal загружается с помощью следующего кода:
Я подтвердил, что файл «javascripts/embed.js» всё ещё существует по тому же пути.
Это блок, который отображается на страницах статей; однако в последнее время в нём показывается только текст «Загрузка обсуждения…»:
Мы не вносили никаких изменений в наш механизм внедрения Discourse или его настройку за последние несколько лет. Были ли какие-либо недавние изменения в функциональности Discourse, которые могли нарушить эту работу? Любая помощь в решении этой проблемы будет очень благодарна!
Мы используем ту же функциональность встраивания на нашем сайте. Я предполагаю, что discourseUrl и discourseEmbedUrl — это не те значения, которые вы указали выше, а соответствующие URL вашего форума?
В остальном код выглядит нормально. Я знаю, что функциональность встраивания работает в актуальной бета-версии Discourse. На прошлой неделе у нас было огромное количество встроенных постов. Странно, что встраивается только начало поста, но кнопка «Показать весь пост» не работает. У нас они загружаются мгновенно
Проверяли ли вы консоль на наличие ошибок?
Вы всегда можете попробовать отключить настройку embed_truncate, просто чтобы проверить, выводится ли весь текст. Это может помочь сузить круг причин проблемы.
Да, всё верно, я использовал плейсхолдер sitename просто для наглядности. Эх, ну, по крайней мере, это облегчает ситуацию: похоже, что функционал встраивания Discourse не сломан! Значит, проблема на нашей стороне.
Я проверил логи Discourse (discourse.sitename.com/logs) и вижу там много уведомлений об устаревании, например, таких:
Уведомление об устаревании: SiteSetting.enable_personal_messages устарел.
Я определённо могу попробовать также отключить embed_truncate, поищу эту настройку следующим шагом. Но эта функция работала годами без проблем, поэтому я не понимаю, почему она могла сломаться…
Попробуйте проверить консоль инструментов разработчика на наличие ошибок при нажатии кнопки «Показать полный пост». Инструменты разработчика можно открыть, щёлкнув правой кнопкой мыши и выбрав «Просмотреть код» (Inspect). Ошибки будут отображаться красным цветом справа.
Да, функция встраивания точно не сломана. На моём сайте она работает несколько раз в день.
Я полагаю, что наш сервер управляется администраторами; я не вносил в него никаких изменений, однако в панели управления Discourse указана дата последнего обновления от 18 апреля. Судя по последнему объявлению, связанному с этой датой, это версия 3.0.3.
Хорошее замечание, спасибо! Я только что проверил и вижу эту ошибку:
Uncaught DOMException: An invalid or illegal string was specified
postUp embed-application.js:6
onload embed-application.js:36
EventHandlerNonNull* embed-application.js:25
<anonymous> embed-application.js:66
[embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js:5](https://conversation.spectrummagazine.org/assets/embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js)
postUp embed-application.js:6
onload embed-application.js:36
(Async: EventHandlerNonNull)
<anonymous> embed-application.js:25
<anonymous> embed-application.js:66
Это очень странно, потому что я недавно не вносил никаких изменений в код или что-либо ещё. Однако я помню, что 2-го числа этого месяца использовал Cloudflare для усиления безопасности; возможно, мне стоит проверить, нет ли там настроек, которые могут блокировать скрипты.
В прошлый раз, когда я проверял это, в консоли инструментов разработчика я видел ошибку CSP, так что, возможно, проблема именно в этом, потенциально на стороне Cloudflare.
Я знаю, что когда наш родительский сайт однажды обновил свою политику онлайн-контента и настройки безопасности, это на несколько дней заблокировало наши встраивания. Однако эффект был другим: блокировались встраивания в обратном направлении, а не публикация их на нашем форуме.
О, отличное решение! Вы случайно не знаете, какое именно настройку безопасности пришлось изменить, чтобы это исправить? Я внес несколько изменений, поэтому не уверен, какую из них конкретно нужно откатить.
Мне удалось точно определить проблему! Я связался с нашей управляемой поддержкой Discourse, и они предоставили IP-адрес, который ранее был добавлен в блок-список нашего WAF из-за большого объема трафика с этого адреса. Оказалось, что для корректной работы коммуникации Discourse этот IP-адрес необходимо было разрешить. Я так рад, что проблема не на стороне Discourse!
Кажется, у меня та же проблема. В консоли разработчика браузера я вижу ошибки DOMException. Однако я не использую Cloudflare. Мой блог, в который встроен iframe Discourse, размещён на Netlify, а сам Discourse — на Communiteq.
Сначала я подумал, что проблема вызвана этим изменением:
Но теперь мне кажется, что дело в чём-то другом? Буду благодарен за любую помощь.
Имеете ли вы доступ к настройкам безопасности и/или сети с вашего сервера на Netlify? Исходя из моего недавнего опыта, на вашем месте я бы проверил настройки безопасности, чтобы убедиться, не заблокированы ли какие-либо IP-адреса. Также рекомендую связаться со службой поддержки Communiteq, так как они могут подтвердить IP-адреса, необходимые для того, чтобы ваш сервер Netlify мог взаимодействовать с Communiteq и успешно выполнять скрипты, нужные для отображения ресурсов Discourse.
Не уверен, что я могу сделать со стороны Netlify, но я разберусь. Хотя я сомневаюсь, что проблема там, потому что технически запросы поступают из браузеров посетителей моего сайта, верно? Если я правильно понимаю, как это работает (и, пожалуйста, поправьте меня, если я ошибаюсь), это клиентский JavaScript, выполняемый в браузере посетителя сайта. Discourse видит в запросе имя хоста сервера, но не IP-адрес. Мой сервер блога не общается с сервером форума. В любом случае это статическая установка блога. Это просто HTML с клиентским JavaScript. Он использует скрипт для отправки данных поста блога в Discourse и загрузки контента с форума во фрейме.
Обратите внимание, что эта проблема отличается от предыдущей.
Проблема в этой теме касалась неспособности Discourse «показать полный пост» на платформе Discourse, поскольку встроенный сайт отказывался передавать содержимое поста в блог Discourse.
Проблема в теме от @fabsh является результатом более свежего патча безопасности в Discourse, который содержит ошибку.
Привет! Я обновляю этот пост, так как в ходе моего расследования этой проблемы кое-что изменилось. Проблема сохраняется после обновления до версии 3.0.4: все недавно созданные статьи имеют проблемы с отображением встроенного кода Discourse. Статьи, созданные до этого обновления, работают без сбоев, поэтому дело не в блокировке IP-адресов.
Похоже, что в последней версии Discourse изменилась логика автоматического создания постов через код встраивания: теперь новый код требует канонический URL. См. ранее упомянутую тему:
Однако это полностью нарушает функциональность встраивания на сайтах вроде моего. Ранее я использовал Node ID в Drupal для встраивания, как показано в коде ниже:
Теперь новый код Discourse требует использования канонического URL, что приводит к созданию дубликатов тем, если кто-то просто изменит заголовок статьи. Именно поэтому я использовал Node ID, так как он не меняется.
Возможно ли сделать этот новый канонический URL необязательным? Я попробовал изменить код встраивания, чтобы использовать его, но проблема с загрузкой вернулась для всех постов, созданных со старым кодом встраивания.
Итак, сейчас, с новым кодом Discourse, работающим на моём продакшн-сайте, у меня есть только два варианта:
Недавно созданные статьи в Drupal показывают «Загрузка…», но блок комментариев никогда не загружается; старые статьи, созданные до версии Discourse 3.0.4, работают нормально.
Или
Недавно созданные статьи в Drupal загружают блок комментариев без проблем, но все старые статьи, созданные до версии Discourse 3.0.4, показывают «Загрузка…», но блок комментариев никогда не загружается.
Есть ли способ сделать эту новую функцию опциональной? Необходимость выбирать между этими двумя вариантами ставит меня в безвыходное положение.