Невозможно использовать номер порта в URL для встраивания медиа в пост

Чтобы мои пользователи могли размещать видео, аудиофайлы и другие медиа, которые они встраивают в сообщения Discourse, я настроил сервер Apache, работающий параллельно с Nginx, на котором запущен Discourse. Сервер Apache работает на порту 8008 для HTTP и на порту 591 для HTTPS (зарезервированные IANA порты для http-alt). Это работает нормально, и содержимое сервера доступно из браузеров при указании номера порта в URL, например:

https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4

Однако, если попытаться встроить этот URL в сообщение Discourse, возникает ошибка:

К сожалению, нам не удалось сгенерировать предварительный просмотр для этой веб-страницы, так как сервер ‘scanalyst.fourmilab.ch’ не найден. Вместо предварительного просмотра в вашем сообщении будет отображена только ссылка.

Если запустить tcpdump и отслеживать DNS-трафик, то при отклонении этого URL ничего не отправляется. Отклонение происходит без какого-либо DNS-запроса. Если изменить номер порта в URL на 443 (стандартный порт для HTTPS), DNS-запрос выполняется нормально, но встраивание всё равно не работает, поскольку сервер Apache не слушает этот порт, а сервер Discourse не знает, что делать с таким URL. В документации Discourse я не нашёл никаких указаний на то, что URL для встраивания не могут содержать номер порта.

Изучив исходный код, я обнаружил проверку в функции validate_uri_format на строке 362 файла lib/final_destination.rb, которая выглядит так:

    return false if @uri.scheme == 'https' && @uri.port != 443

Похоже, что эта проверка отклоняет URL с HTTPS, если используется порт, отличный от 443. Это казалось объяснением наблюдаемой проблемы, поэтому я закомментировал эту строку, но это не дало никакого эффекта, даже после перезапуска Discourse. Когда сообщение появляется на сайте, и встраивание преобразуется в текстовую ссылку, при клике на неё видео отображается корректно. Таким образом, проблема заключается только в том, что система не распознаёт URL как встраиваемый и не оборачивает его в встроенный плеер.

На данном этапе у меня следующие вопросы:

  • Предназначены ли нестандартные номера портов для работы с URL встраиваемых материалов в сообщениях Discourse?
  • Если да, то что вызывает отклонение таких URL?
  • Есть ли способ заставить их работать?

В марте 2017 года здесь обсуждалась эта проблема в двух сообщениях:

В них подразумевалось, что проблема была исправлена, но сегодня в версии 2.9.0.beta10 это не работает.

Заранее спасибо за любые разъяснения и/или помощь в этом вопросе.

1 лайк