Кнопка «Показать полный пост» не работает при установке в подпапке

Может :slight_smile:

У вас есть доступ к экземпляру, на котором это запущено? Если да, пожалуйста, выполните следующие команды и сообщите результат:

./launcher enter app
rails c
TopicEmbed.find_by(topic_id: 157441).as_json
discourse(prod)> TopicEmbed.find_by(topic_id: 157441).as_json
Сериализация моделей ActiveRecord (TopicEmbed) без указания полей не допускается. Используйте Serializer или передайте опцию :only в #serializable_hash. Подробнее: ``https://meta.discourse.org/t/-/314495
=>
{"id"=>56685,
"topic_id"=>157441,
"post_id"=>483289,
"embed_url"=>
"``https://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix"``,
"content_sha1"=>nil,
"created_at"=>"2025-12-08T17:54:07.585Z",
"updated_at"=>"2025-12-09T18:04:33.539Z",
"deleted_at"=>nil,
"deleted_by_id"=>nil,
"embed_content_cache"=>""}
discourse(prod)>

Вы редактировали вывод перед тем, как поделиться им? Просто глядя на значение embed_url, оно выглядит так:

“``https://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix”``

Можете ли вы просто запустить ту же команду снова, но на этот раз:

./launcher enter app
rails c
TopicEmbed.find_by(topic_id: 157441).embed_url

Если то, что вы поделились, действительно является значением embed_url в вашей базе данных, то это и есть проблема, и я сделаю небольшой PR в discourse/discourse, чтобы обрабатывать такие крайние случаи, когда embed_url оказался в некорректном состоянии.

Нет! Я просто скопировал и вставил его сюда.

Насчёт этих обратных кавычек в начале и в конце URL, я думаю, это была просто ошибка при попытке отформатировать текст здесь в теме, используя кнопку кода.

discourse(prod)> TopicEmbed.find_by(topic_id: 157441).embed_url
=> "https://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix"
discourse(prod)>

Здесь вы можете увидеть тему, созданную с помощью Embed JS:

https://tecnoblog.net/comunidade/t/microsoft-edge-ganha-copilot-mode-que-promete-realizar-tarefas-usando-ia-tecnoblog/157661

Кнопка «Показать полный пост» также не работает в этой теме.

Таким образом, вся проблема здесь в том, что указанный выше PR начал удалять хвостовые слэши из TopicEmbed в январе этого года? Я чувствую себя раздвоенным из-за этого изменения. Честно говоря, я бы предпочёл, чтобы мы уважали то, что администратор отправляет нам.

Думаю, это корень наших проблем.

@Thiago_Mobilon, пожалуйста, выполните следующее:

url = "https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento"

fd = FinalDestination.new(url, validate_uri: true, max_redirects: 5, follow_canonical: true)

uri = fd.resolve

puts uri

html = FinalDestination::HTTP.get(uri)

puts html.truncate(200)

fd.resolve должен быть способен добавить хвостовой слэш в строке puts uri. Боюсь, что это не удаётся.

discourse(prod)> url = "https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento"
discourse(prod)> 
discourse(prod)> fd = FinalDestination.new(url, validate_uri: true, max_redirects: 5, follow_canonical: true)
discourse(prod)> 
discourse(prod)> uri = fd.resolve
discourse(prod)> 
discourse(prod)> puts uri
discourse(prod)> 
discourse(prod)> html = FinalDestination::HTTP.get(uri)
discourse(prod)> 
discourse(prod)> puts html.truncate(200)
https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento

=> nil

Действительно, перенаправления не выполняются. Форум работает на том же сервере / в том же IP-пространстве, что и блог? Возможно, это активирует нашу защиту от SSRF.

Если это так, вам нужно разрешить это через настройку allowed_internal_hosts

Обратите внимание:

Причина, по которой мы внесли это изменение, заключается в том, что существовала несогласованность между тем, как работают встраивания WP Discourse и встраивания через JavaScript. Встраивания через JavaScript всегда нормализовывали URL. Встраивания WP Discourse приходили другим путём и не нормализовывали URL (до тех пор, пока мы не внесли это изменение). Это приводило к другим несогласованностям.

Вы имеете в виду вот так? (Уже было так)

Нет, он находится на выделенном VPS. Машина блога проксирует трафик (nginx) из подкаталога на VPS с Discourse.

Ещё одна проблема заключается в том, что при выполнении запроса curl к API для поиска ID темы по встраиваемому URL я не могу его найти из-за завершающего слеша. Discourse возвращает страницу 404.

Однако, если убрать завершающий слеш, возвращается значение:

mobilon@Thiagos-MacBook-Pro ~ % curl 'https://tecnoblog.net/comunidade/embed/info?embed_url=https://tecnoblog.net/noticias/anatel-e-receita-apreendem-quase-meio-milhao-de-produtos-em-santa-catarina/' -H 'API-KEY: <API KEY>' -H 'API-USERNAME: <USERNAME>'

<!DOCTYPE html>

<html lang="pt-BR">

<head>

  <meta charset="utf-8">

  <title>Страница не найдена - Tecnoblog Сообщество</title>
mobilon@Thiagos-MacBook-Pro ~ % curl 'https://tecnoblog.net/comunidade/embed/info?embed_url=https://tecnoblog.net/noticias/anatel-e-receita-apreendem-quase-meio-milhao-de-produtos-em-santa-catarina' -H 'API-KEY: <API KEY>' -H 'API-USERNAME: <USERNAME>' 

{"topic_id":157645,"post_id":484103,"topic_slug":"anatel-e-receita-apreendem-quase-meio-milhao-de-produtos-em-santa-catarina-tecnoblog","comment_count":15}%     

Чтобы это работало, мне пришлось бы выполнить замену строки в WordPress для удаления завершающего слеша из постоянной ссылки перед проверкой. Но это не имеет смысла, поскольку канонический URL содержит завершающий слеш…

На практике Discourse нормализует постоянную ссылку до URL, которого не существует… нормализованная версия должна быть именно с завершающим слешем.

Благодаря @Thiago_Mobilon я нашел проблему и предлагаю решение

@Thiago_Mobilon исправление внесено, не могли бы вы обновиться?

Работает, спасибо, Falco!

Но я всё ещё обеспокоен URL-адресами без завершающего слэша по причинам, указанным в моём предыдущем посте. Стоит ли мне открыть новую тему по этому вопросу, @angus?

Спасибо, приятно это слышать.

Конечно! Это не повлияет на функцию «Полный пост», так как мы теперь можем обрабатывать перенаправления на сайтах в том же домене, что и форум, но вы можете продолжить обсуждение других вопросов в новой теме.