يعمل الكود التالي في 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')
يعمل بشكل جيد.
هل تستخدم شبكة توصيل محتوى (CDN) في أي من هذين الموقعين؟ لقد لاحظت أن تمييز الكود لم يعد يعمل على موقعي، وأعتقد أن السبب هو هذا:
في حالتي، شبكة توصيل المحتوى الخاصة بي لا تُرجع ترويسة Access-Control-Allow-Origin لملف highlightjs. ألاحظ أن شبكة توصيل المحتوى الخاصة بـ Meta تتضمن هذه الترويسة، لذلك أتساءل ما هو المختلف.
نعم، أنا أستخدم شبكة توصيل محتوى (CDN) على efg.com، ولكن عندما أقوم بالوصول إلى ملف js، فإنه يعيد لي Access-Control-Allow-Origin صحيح، وهذا مربك للغاية بالنسبة لي.
كمتابعة، قمت بتعيين cdn_origin_hostname إلى اسم النطاق العادي لمثيل Discourse الخاص بي، وقمت بمسح ذاكرة التخزين المؤقت لشبكة توصيل المحتوى (CDN)، والآن يعمل highlightjs مرة أخرى. لم ألاحظ أي آثار جانبية…