Para permitir que mis usuarios alojen videos, archivos de audio, etc. que incrustan en publicaciones de Discourse, he configurado un servidor Apache ejecutándose junto con Nginx que ejecuta Discourse. El servidor Apache se ejecuta en el puerto 8008 para http: y en el puerto 591 para https: (puertos IANA reservados para http-alt). Esto funciona bien y el contenido del servidor es accesible desde los navegadores especificando el número de puerto en la URL, por ejemplo:
https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4
Pero si intentas incrustar esta URL en una publicación de Discourse, falla con:
Lo sentimos, no pudimos generar una vista previa de esta página web porque no se pudo encontrar el servidor ‘scanalyst.fourmilab.ch’. En lugar de una vista previa, solo aparecerá un enlace en tu publicación.
Si ejecuto tcpdump y monitoreo el tráfico DNS, no veo que se envíe nada cuando rechaza esta URL. La rechaza sin realizar nunca una consulta DNS. Si cambio el número de puerto en la URL a 443, el predeterminado para https:, realiza la consulta DNS normalmente pero la incrustación falla, por supuesto, porque el servidor Apache no está escuchando en ese puerto y el servidor Discourse no sabe qué hacer con la URL. No he visto nada en la documentación de Discourse que indique que las URL incrustadas no pueden especificar un número de puerto.
Revisando el código fuente, encontré una prueba en la función validate_uri_format en la línea 362 de lib/final_destination.rb que dice:
return false if @uri.scheme == 'https' && @uri.port != 443
que parece rechazar una URL https: que usa un puerto que no sea 443. Esto pareció explicar lo que estaba viendo, así que comenté esta línea, pero no hizo ninguna diferencia, incluso después de reiniciar Discourse. Cuando la publicación aparece en el sitio con la incrustación convertida en un enlace de texto, hacer clic en el enlace de texto muestra el video correctamente, por lo que el único problema es que no lo reconoce como una incrustación y no le aplica el reproductor en línea.
Mis preguntas son, en este punto:
- ¿Se espera que los números de puerto no estándar funcionen en las URL para incrustaciones en publicaciones de Discourse?
- Si es así, ¿qué está causando que estas URL sean rechazadas?
- ¿Hay alguna manera de hacer que funcionen?
Hubo una discusión aquí en marzo de 2017 sobre este problema en estas dos publicaciones:
- Specifying port for embeddable host given an IP results in error
- FIX: Allow ports for embed host IPs #4759 (en GitHub)
que implicaban que el problema se había solucionado, pero hoy no funciona en 2.9.0.beta10.
Gracias por cualquier información y/o asistencia en este asunto.