Проблема с относительным путем вызывает ошибку CORS на сайтах Discourse

Следующий код в lib/highlight_js.rb работает на некоторых доменах, но не на других:

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

У меня есть два сайта Discourse. Этот код работает на домене www.abc.com, но не работает на efg.com. В консоли браузера я вижу следующую ошибку:

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.

После изменения self.path в файле highlight_js.rb следующим образом:

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

проблема была решена.

Похоже, что использование относительного пути, такого как
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'),
вызывает проблему CORS, тогда как использование абсолютного URL,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'), работает корректно.

1 лайк

Странно, что работает с abc.com, но не с efg.com, ведь эти два разных маршрута совершенно не связаны :thinking:

Я имею в виду, что это работает с www.abc.com, но не с efg.com. Не уверен, почему, но у меня такое случается.

1 лайк

Используете ли вы CDN на одном из этих сайтов? Я заметил, что подсветка кода перестала работать на моём сайте, и, думаю, это связано с этим:

В моём случае мой CDN не возвращает заголовок Access-Control-Allow-Origin для файла highlightjs. Я вижу, что CDN Meta включает этот заголовок, поэтому интересно, в чём разница.

$ 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

Однако эти заголовки не отправляются исходным сервером:

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

Насколько я могу судить, Discourse должен добавлять заголовки access-control к файлам highlightjs:

Однако эти заголовки применяются только если запрос является «запросом к CDN»:

Это работает только если Discourse настроен с отдельным именем хоста для «запросов к CDN».

1 лайк

Существует настройка cdn_origin_hostname, которую, возможно, стоит установить на обычное имя хоста Discourse:

Думаю, это позволит пройти проверке is_cdn_request, но не уверен, не вызовет ли это каких-либо негативных побочных эффектов.

Да, я использую CDN на efg.com, но при доступе к JS-файлу он возвращает мне корректный Access-Control-Allow-Origin, что меня довольно сбивает с толку.

В продолжение темы: я установил cdn_origin_hostname в обычное доменное имя моего экземпляра Discourse, очистил кэш CDN, и теперь highlightjs снова работает. Я не заметил никаких побочных эффектов…

Я тоже столкнулся с этой проблемой. Есть какие-то обновления?