Problema com caminho relativo causando erro CORS em sites Discourse

O seguinte código em lib/highlight_js.rb funciona em alguns domínios, mas não em outros:

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

Tenho dois sites Discourse. Este código funciona no domínio www.abc.com, mas não funciona em efg.com. No console do navegador, vejo o seguinte erro:

formatter.js:383 Uncaught (in promise) TypeError: Failed to resolve module specifier '/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'. A URL base é about:blank porque import() é chamado de um script CORS-cross-origin.

Após modificar self.path em highlight_js.rb da seguinte forma:

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

o problema foi resolvido.

Parece que usar um caminho relativo como
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
causa um problema de CORS, enquanto usar uma URL absoluta,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js') , funciona bem.

1 curtida

Estranho que funcione com abc.com mas não com efg.com, já que as 2 rotas diferentes são completamente distintas :thinking:

Quero dizer que funciona com www.abc.com, mas não com efg.com. Não tenho certeza do porquê, mas acontece nos meus casos.

1 curtida

Você está usando uma CDN em algum desses sites? Notei que a coloração de código não está mais funcionando no meu site, e acho que é por causa disso:

No meu caso, minha CDN não está retornando um cabeçalho Access-Control-Allow-Origin para o arquivo highlightjs. Notei que a CDN do Meta inclui esse cabeçalho, então me pergunto o que é 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

No entanto, esses cabeçalhos não estão sendo servidos pelo servidor de origem:

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

Pelo que pude apurar, o Discourse deve adicionar cabeçalhos access-control aos arquivos highlightjs:

No entanto, esses cabeçalhos só são aplicados se a solicitação for uma “solicitação de CDN”:

Isso só funciona se o Discourse for configurado com um nome de host separado para “solicitações de CDN”.

1 curtida

Existe uma configuração, cdn_origin_hostname, que talvez possa ser definida para o nome de host normal do Discourse:

Acho que isso faria a verificação is_cdn_request passar, mas não sei se teria algum efeito colateral negativo.

Sim, estou usando um CDN em efg.com, mas quando acesso o arquivo js ele me retorna um Access-Control-Allow-Origin correto, o que me deixa bastante confuso.

Como acompanhamento, defini cdn_origin_hostname para o nome de domínio normal da minha instância do Discourse, limpei o cache do CDN e agora o highlightjs está funcionando novamente. Eu ainda não notei nenhum efeito colateral…

Eu também enfrento esse problema. Alguma atualização?