Discourseサイトにおける相対パス関連のCORSエラー問題

lib/highlight_js.rb の以下のコードは、一部のドメインでは機能しますが、他のドメインでは機能しません。

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

私は2つの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.

highlight_js.rb の self.path を次のように変更した後:

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では動作しないのは奇妙ですね。2つの異なるルートは完全に異なるはずなのに:thinking:

www.abc.com では動作しますが、efg.com では動作しません。理由は不明ですが、私のケースで発生しています。

「いいね!」 1

これらのサイトのいずれかでCDNを使用していますか?コードのハイライトが私のサイトで機能しなくなったことに気づきましたが、原因はこれだと思います。

私の場合は、CDNがhighlightjsファイルに対してAccess-Control-Allow-Originヘッダーを返していません。MetaのCDNは、そのヘッダーを含んでいることに気づいたので、何が違うのか疑問に思っています。

$ 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

私の知る限り、Discourseはhighlightjsファイルにaccess-controlヘッダーを追加するように設計されています。

しかし、これらのヘッダーはリクエストが「CDNリクエスト」である場合にのみ適用されます。

これは、Discourseが「CDNリクエスト」用に別のホスト名で構成されている場合にのみ機能します。

「いいね!」 1

cdn_origin_hostname という設定があり、おそらく通常の Discourse ホスト名に設定できる可能性があります。

これにより is_cdn_request チェックがパスすると思いますが、副作用があるかどうかはわかりません。

はい、efg.comでCDNを使用していますが、jsファイルにアクセスすると、正しいAccess-Control-Allow-Originが返されます。それが私を非常に混乱させています。

フォローアップとして、cdn_origin_hostname を通常の Discourse インスタンスのドメイン名に設定し、CDN キャッシュをフラッシュしたところ、highlightjs が再び動作するようになりました。まだ副作用は気づいていません

私もこの問題に直面しています。何かアップデートはありますか?