مشكلة في المسار النسبي تسبب خطأ 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) في أي من هذين الموقعين؟ لقد لاحظت أن تمييز الكود لم يعد يعمل على موقعي، وأعتقد أن السبب هو هذا:

في حالتي، شبكة توصيل المحتوى الخاصة بي لا تُرجع ترويسة Access-Control-Allow-Origin لملف highlightjs. ألاحظ أن شبكة توصيل المحتوى الخاصة بـ 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

على حد علمي، من المفترض أن يضيف Discourse ترويسات التحكم في الوصول إلى ملفات 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 مرة أخرى. لم ألاحظ أي آثار جانبية…

أنا أواجه المشكلة أيضًا. أي تحديث؟