Problema con la ruta relativa que causa error CORS en sitios de Discourse

El siguiente código en lib/highlight_js.rb funciona en algunos dominios pero no en otros:

def self.path
    "/highlight-js/#{Discourse.current_hostname}/#{version SiteSetting.highlighted_languages}.js"
end

Tengo dos sitios de Discourse. Este código funciona en el dominio www.abc.com, pero no funciona en efg.com. En la consola del navegador, veo el siguiente error:

formatter.js:383 Uncaught (in promise) TypeError: Failed to resolve module specifier '/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'. La URL base es about:blank porque import() se llama desde un script CORS-cross-origin.

Después de modificar self.path en highlight_js.rb de la siguiente manera:

def self.path
    "https://#{Discourse.current_hostname}/highlight-js/#{Discourse.current_hostname}/#{version SiteSetting.highlighted_languages}.js"
end

el problema se resolvió.

Parece que usar una ruta relativa como
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
causa un problema CORS, mientras que usar una URL absoluta,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js') , funciona bien.

1 me gusta

Es extraño que funcione con abc.com pero no con efg.com, ya que las 2 rutas diferentes son completamente distintas :thinking:

Quiero decir que funciona con www.abc.com pero no con efg.com, no estoy seguro de por qué, pero sucede en mis casos.

1 me gusta

¿Estás utilizando una CDN en alguno de estos sitios? He notado que el resaltado de código ya no funciona en mi sitio, y creo que es por esto:

En mi caso, mi CDN no está devolviendo una cabecera Access-Control-Allow-Origin para el archivo highlightjs. Noto que la CDN de Meta incluye esa cabecera, así que me pregunto qué es diferente.

$ curl --silent -I https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/meta.discourse.org/9797975efac87d28baa695ae13ca72ccaf5120f5.js | grep -i access-control
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD, OPTIONS

Sin embargo, esas cabeceras no están siendo servidas por el servidor de origen:

$ curl --silent -I https://meta.discourse.org/highlight-js/meta.discourse.org/9797975efac87d28baa695ae13ca72ccaf5120f5.js | grep -i access-control

Por lo que puedo ver, Discourse está diseñado para añadir cabeceras access-control a los archivos highlightjs:

Sin embargo, esas cabeceras solo se aplican si la solicitud es una “solicitud de CDN”:

Esto solo funciona si Discourse está configurado con un nombre de host separado para las “solicitudes de CDN”.

1 me gusta

Hay una configuración, cdn_origin_hostname, que quizás podría establecerse en el nombre de host normal de Discourse:

Creo que esto haría que la comprobación is_cdn_request se aprobara, pero no sé si tendría algún efecto secundario negativo.

Sí, estoy usando una CDN en efg.com, pero cuando accedo al archivo js me devuelve un Access-Control-Allow-Origin correcto, lo que me confunde bastante.

Como seguimiento, configuré cdn_origin_hostname con el nombre de dominio normal de mi instancia de Discourse, vacié la caché de la CDN y ahora highlightjs funciona de nuevo. No he notado ningún efecto secundario…

Yo también me encuentro con este problema. ¿Alguna actualización?