Problème de chemin relatif provoquant une erreur CORS sur les sites Discourse

Le code suivant dans lib/highlight_js.rb fonctionne sur certains domaines mais pas sur d’autres :

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

J’ai deux sites Discourse. Ce code fonctionne sur le domaine www.abc.com, mais il ne fonctionne pas sur efg.com. Dans la console du navigateur, je vois l’erreur suivante :

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.

Après avoir modifié self.path dans highlight_js.rb comme suit :

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

le problème a été résolu.

Il semble que l’utilisation d’un chemin relatif comme
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
provoque un problème CORS, tandis que l’utilisation d’une URL absolue,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js') , fonctionne bien.

1 « J'aime »

Étrange que cela fonctionne avec abc.com mais pas avec efg.com, puisque les 2 différentes routes sont complètement différentes :thinking:

Je veux dire que cela fonctionne avec www.abc.com mais pas avec efg.com, je ne suis pas sûr pourquoi, mais cela se produit dans mes cas

1 « J'aime »

Utilisez-vous un CDN sur l’un de ces sites ? J’ai remarqué que la coloration du code ne fonctionne plus sur mon site, et je pense que c’est à cause de ceci :

Dans mon cas, mon CDN ne renvoie pas d’en-tête Access-Control-Allow-Origin pour le fichier highlightjs. Je remarque que le CDN de Meta inclut cet en-tête, je me demande donc ce qui est différent.

$ 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

Cependant, ces en-têtes ne sont pas servis par le serveur d’origine :

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

D’après ce que je peux voir, Discourse est censé ajouter des en-têtes access-control aux fichiers highlightjs :

Cependant, ces en-têtes ne sont appliqués que si la requête est une « requête CDN » :

Cela ne fonctionne que si Discourse est configuré avec un nom d’hôte distinct pour les « requêtes CDN ».

1 « J'aime »

Il existe un paramètre, cdn_origin_hostname, qui pourrait peut-être être défini sur le nom d’hôte normal de Discourse :

Je pense que cela ferait passer la vérification is_cdn_request, mais je ne sais pas s’il y aurait des effets secondaires négatifs.

Oui, j’utilise un CDN sur efg.com, mais lorsque j’accède au fichier js, il me renvoie un Access-Control-Allow-Origin correct, ce qui me laisse assez perplexe.

Pour faire suite, j’ai défini cdn_origin_hostname sur le nom de domaine normal de mon instance Discourse, j’ai vidé le cache du CDN, et maintenant highlightjs fonctionne à nouveau. Je n’ai pas remarqué d’effets secondaires…

Je rencontre aussi ce problème. Des mises à jour ?