Problema con il percorso relativo che causa errore CORS sui siti Discourse

Il seguente codice in lib/highlight_js.rb funziona su alcuni domini ma non su altri:

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

Ho due siti Discourse. Questo codice funziona sul dominio www.abc.com, ma non funziona su efg.com. Nella console del browser, vedo il seguente errore:

formatter.js:383 Uncaught (in promise) TypeError: Failed to resolve module specifier '/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'. The base URL is about:blank because import() is called from a CORS-cross-origin script.

Dopo aver modificato self.path in highlight_js.rb come segue:

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

il problema è stato risolto.

Sembra che l’utilizzo di un percorso relativo come
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
causi un problema CORS, mentre l’utilizzo di un URL assoluto,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js') , funzioni correttamente.

1 Mi Piace

Strano che funzioni con abc.com ma non con efg.com, dato che i 2 diversi percorsi sono completamente diversi :thinking:

Voglio dire che funziona con www.abc.com ma non con efg.com, non sono sicuro del perché ma succede nei miei casi

1 Mi Piace

Stai utilizzando una CDN su uno di questi siti? Ho notato che l’evidenziazione del codice non funziona più sul mio sito e penso che sia a causa di questo:

Nel mio caso, la mia CDN non restituisce un’intestazione Access-Control-Allow-Origin per il file highlightjs. Noto che la CDN di Meta include tale intestazione, quindi mi chiedo cosa sia diverso.

$ 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

Tuttavia, queste intestazioni non vengono servite dal server di origine:

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

Per quanto ne so, Discourse dovrebbe aggiungere intestazioni access-control ai file highlightjs:

Tuttavia, queste intestazioni vengono applicate solo se la richiesta è una “richiesta CDN”:

Questo funziona solo se Discourse è configurato con un nome host separato per le “richieste CDN”.

1 Mi Piace

C’è un’impostazione, cdn_origin_hostname, che potrebbe forse essere impostata sul normale nome host di discourse:

Penso che ciò farebbe superare il controllo is_cdn_request, ma non so se avrebbe effetti negativi.

Sì, sto usando un CDN su efg.com, ma quando accedo al file js mi restituisce un Access-Control-Allow-Origin corretto, il che mi confonde parecchio.

Come seguito, ho impostato cdn_origin_hostname sul normale nome di dominio della mia istanza Discourse, ho svuotato la cache CDN e ora highlightjs funziona di nuovo. Non ho notato effetti collaterali…

Anche io incontro questo problema. Qualche aggiornamento?