مرحبًا فريق الدعم!
عندما أحاول التضمين باستخدام مقتطف الجافا سكريبت المقدم، يتوقف عند “تحميل النقاش” وأحصل على الخطأ التالي:
Invalid X-Frame-Options: “ALLOWALL” header from ...
كيف يمكنني حل هذه المشكلة؟
شكرًا لكم!
قد يكون هذا متأخرًا، لكنني واجهت نفس المشكلة، وكان سيكون من المفيد الحصول على إجابة هنا. لم تظهر مشكلتي إلا عند استخدام متصفح فايرفوكس. بينما عملت كروم دون أي مشكلة. قمت بحلها بإضافة الموقع الذي يضمن المحتوى إلى إعداد “أصول CORS”. حصلت على التوجيه هنا.
لاحظت للتو أن مواقعنا تواجه هذه المشكلة أيضًا، ولكن فقط مع المنشورات الجديدة، وليس المنشورات الموجودة التي تم إنشاء موضوع مصاحب لها بالفعل. يبدو أن رأسية Invalid X-Frame-Options تحذير من متصفح فايرفوكس أكثر من كونه خطأ فعليًا، حيث يظهر دائمًا، حتى لو نجح التضمين.
مثال يعمل (مع موضوع موجود عندما كان التضمين يعمل سابقًا)
بينما تستقبل صفحة الهبوط هذه:
في النهاية استجابة خطأ 400 (طلب غير صالح) من مثيل Discourse الخاص بنا..
لقد بحثت في هذه المنتديات والوثائق لمعرفة سبب حدوث ذلك، لكنني لم أجد أي شيء حتى الآن.. ظننت أن الأمر قد يكون متعلقًا بتضمين اسم مستخدم Discourse في حمولة التضمين، لكن هذا يحدث أيضًا للمحتوى الذي أنشأه مستخدمون تم مزامنتهم بشكل صحيح (على سبيل المثال، Winter School on Agent-Based Modeling of Social-Ecological Systems)
الأشياء التي تحققت منها:
- تم تعيين
DISCOURSE_ENABLE_CORS: true - استضافات CORS صحيحة في إعدادات Discourse مع https
- تم تعيين الاستضافات المسموح بها بشكل صحيح (كما أن التضمين يعمل مع منشورات Discourse التي تم إنشاؤها مسبقًا)
هل هناك أي أشياء أخرى يجب أن أضعها في الاعتبار؟ الشيء الوحيد الآخر الذي يمكنني التفكير فيه هو أننا قمنا مؤخرًا بدمج مواقعنا مع CloudFlare، لذا ربما يكون هناك بعض تكوين CloudFlare الذي يحتاج إلى حدوث لجعل الأشياء تعمل بشكل صحيح. لا يزال الأمر محيرًا بالنسبة لي لماذا تعمل المواضيع الموجودة بشكل صحيح..
يجب أن تجرب تعطيل Cloudflare مؤقتًا لترَ ما إذا كان ذلك يساعد. الأمر سهل التنفيذ…
تفكير جيد، لقد جربته على موقع الاختبار (staging) لدينا ولكن للأسف لم يحل المشكلة..
على متصفح كروم، أرى أخطاءً مثل ما يلي:
فشل تنفيذ 'postMessage' على 'DOMWindow': أصل الهدف المقدم ('https://test-discourse.comses.net') لا يطابق أصل نافذة المستلم ('https://test.comses.net').
(من https://test.comses.net/codebases/f0613922-9cb1-4656-a26c-af57f823fb69/releases/3.2.0/)
يبدو أن أشخاصًا آخرين هنا تمكنوا من حل هذه المشكلة عن طريق التأكد من أن DiscourseEmbed.discourseEmbedUrl يطابق عنوان URL المرجعي، لكنني تحققت من أنه لا يزال صحيحًا.. لقد بحثت في سجلات Discourse (هل يجب أن أنظر إلى /var/discourse/shared/standalone/log/rails/production.log؟) ولكن لم أجد أي أخطاء هناك أيضًا.. هل هناك أي أفكار أخرى حول الأماكن التي يمكن البحث فيها لاستكشاف هذه المشكلة وإصلاحها؟
مثال من سجلات Discourse:
Started GET "/embed/comments?embed_url=https%3A%2F%2Ftest.comses.net%2Fcodebases%2Ff0613922-9cb1-4656-a26c-af57f823fb69%2Freleases%2F3.2.0%2F" for 72.201.57.141 at 2020-08-05 05:15:40 +0000
Processing by EmbedController#comments as HTML
Parameters: {"embed_url"=>"https://test.comses.net/codebases/f0613922-9cb1-4656-a26c-af57f823fb69/releases/3.2.0/"}
Rendering embed/loading.html.erb within layouts/embed
Rendered embed/loading.html.erb within layouts/embed (Duration: 0.4ms | Allocations: 134)
Completed 200 OK in 91ms (Views: 1.8ms | ActiveRecord: 0.0ms | Allocations: 16308)
Started GET "/service-worker-c8000968830b6f6bd33f1e842dffdd569664119d449f93dc7d428d963a71635d.js" for 72.201.57.141 at 2020-08-05 05:15:42 +0000
Processing by StaticController#service_worker_asset as */*
Rendering text template
Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 200 OK in 27ms (Views: 1.3ms | ActiveRecord: 0.0ms | Allocations: 6617)
لدي نفس المشكلة. يمكنك رؤية ذلك مباشرة على سبيل المثال: Making sure you're not a bot! حيث يوجد في الأسفل نقاش مُضمَّن من @mock/mock - Fedora Discussion. تجدر الإشارة إلى أن discussion.fedoraproject.org هي نسخة مدفوعة وتُقدَّم كخدمة من قبل Discourse.
ما يُربكني هو أن النقاش يُحمّل أحيانًا، وفي أحيان أخرى لا يُحمّل. أستطيع تكرار المشكلة (تقريبًا دائمًا) في وضع التصفح الخاص بمتصفح فايرفوكس (الإصدار 80).
تُظهر أدوات المطور ما يلي:
تم العثور على رأس X-Frame-Options غير صالح عند تحميل “@mock/mock - Fedora Discussion”: “ALLOWALL” ليس توجيهًا صالحًا.
وفي الواقع، لا تدرج الوثائق الرسمية X-Frame-Options header - HTTP | MDN قيمة ALLOWALL كقيمة معتمدة.
يبدو أن الموضوع الذي ربطت به في https://discussion.fedoraproject.org/t/mock-mock/3107 يقع ضمن فئة محمية - فلا أستطيع الوصول إليه كزائر مجهول. طالما أن منتدى ديسكورش وموقعك الإلكتروني يشتركان في نفس النطاق الجذري، فإنني أتوقع أن تُحمّل التعليقات المدمجة للمستخدمين المسجلين في المنتدى، لكنها تفشل في التحميل للمستخدمين غير المسجلين. هل يبدو هذا متطابقًا مع ما تلاحظه؟
أتوقع أن التعليقات المضمنة تُحمّل للمستخدمين المسجلين في المنتدى، لكنها تفشل في التحميل للمستخدمين غير المسجلين. هل يبدو أن هذا يتطابق مع ما تلاحظه؟
يبدو أن هذا هو الحال بالفعل. لقد تمكنت من تكرار هذا السلوك في كل من متصفح جوجل كروم وفايرفوكس. ومع ذلك، لا يتم تحميل النقاش في وضع التصفح الخاص في أي من هذين المتصفحين، ولا أعرف ما إذا كان ذلك يعني شيئًا. لكنني أعتقد أنه لا يزال يشير إلينا إلى تحديث الفئة، بحيث يمكن رؤيتها من قبل الجميع.
شكرًا لك. بعد تعديل الفئة وإضافة “الجميع” في تبويب الأمان بحيث يمكنهم “إنشاء/الرد/المشاهدة”، تعمل التضمين مرة أخرى.
إذن، بعد تحديث Discourse الأخير، تظهر جميع الصفحات المضمنة رسالة خطأ ![]()
رسالة خطأ نموذجية نراها الآن تشبه هذا النص، والتي تبدو وكأنها تشير إلى أن المتصفح يقوم بإزالة معلومات الإحالة (referer) مما يتسبب في فشل تحققات كود التضمين الخاص بـ Discourse:
Referer: `https://www.comses.net/`
إما أن معلومات الإحالة (referer) لم تُرسل، أو أنها لم تطابق أيًا من المضيفين التاليين:
* www.comses.net/codebases/.*
مثال على الصفحة: Artificial Anasazi
على متصفح Chrome، حتى مع تعطيل Privacy Badger وجميع الإضافات الأخرى، تبدو رسالة خطأ الإحالة (referer) تظهر دائمًا، وربما يكون ذلك بسبب A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin | Blog | Chrome for Developers تحديث: هذا يعمل الآن للمواضيع الموجودة بعد إضافة سياسة إحالة (Referrer-Policy) صريحة إلى الموقع المصدر (مثل https://www.comses.net)، لذا بالنسبة لـ haproxy، يمكن استخدام الأمر التالي: http-response set-header Referrer-Policy "no-referrer-when-downgrade"
على متصفح Firefox و Chrome، تعمل الصفحات التي تحتوي على مواضيع موجودة، لكن الصفحات التي تحاول إنشاء موضوع جديد تفشل مثل هذه الصفحة: The Bronze Age Collapse model (BACO model).
لقد قمت بتغيير إعدادات haproxy الخاصة بنا لتعيين رؤوس الاستجابة لـ Content-Security-Policy frame-ancestors، وقد تم إصلاح خطأ X-Frame-Options ALLOWALL not recognized غير الصالح في Firefox، لكن الآن الطلب ينقضي قبل إتمامه (timeout) وينتهي في النهاية بـ 400 Bad Request من منتدى Discourse الخاص بنا..
يبدو أن الخطأ مرتبط بـ postMessage:
فشل تنفيذ 'postMessage' على 'DOMWindow': الأصل المستهدف المقدم ('https://forum.comses.net') لا يطابق أصل نافذة المستلم ('https://www.comses.net').
سأكون لدي وقت أكثر للبحث بعمق في نهاية هذا الشهر عندما أكون لدي بعض الوقت الحر، لكن أردت مشاركة ما توصلت إليه بينما لا يزال الأمر طازجًا نسبيًا - آمل أن يتمكن شخص آخر من إيجاد حل بديل في هذه الأثناء! ![]()
يحدث لي نفس الشيء. آمل أن يتمكن أي شخص هنا من المساعدة قليلاً في هذا الخطأ. في حالتي، لدي مدونة تجريبية ومدونة رسمية… وكلاهما تم إنشاؤه باستخدام Webflow… في المدونة التجريبية يعمل كل شيء بشكل صحيح، لكنه يظهر هذا الخطأ في المدونة الحية…
### خطأ في التضمين
مرجع: `https://www.pynk.io/blog/what-to-invest-in-look-around-you`
إما أنه لم يتم إرسال المرجع، أو أنه لا يطابق أيًا من المضيفات التالية:
[مساحة فارغة هنا]
آسف على التأخر في الرد. هل يمكنك تجربة إضافة discourseReferrerPolicy: 'no-referrer-when-downgrade' إلى كائن DiscourseEmbed الموجود في مقتطف كود التضمين؟ هناك مثال كامل لمقتطف كود يضيف هذه الخاصية هنا: Embed Discourse comments on another website via Javascript - #353.
إذا جربت ذلك، يرجى إخبارنا ما إذا كان ذلك يحل المشكلة بالنسبة لك.
أعتقد أن هذا تم حله هنا: Embed Discourse comments on another website via Javascript - #365. في تلك الحالة، كانت المشكلة هي غياب نطاق فرعي www في سجل المضيف القابل للتضمين في Discourse.
تعديل: تم إصلاح هذه المشكلة الآن في الكود الأساسي لـ Discourse. لم يعد هناك حاجة إلى تعيين متغير discourseReferrerPolicy إلى 'no-referrer-when-downgrade'. يقوم Discourse الآن بتعيين سياسة الإحالة إلى 'no-referrer-when-downgrade' بشكل افتراضي. لمزيد من التفاصيل حول هذا، راجع https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963#setting-the-referrer-policy.
إضافة discourseReferrerPolicy حلّت المشكلة - شكرًا لك، @simon !! ![]()
قد يتسبب هذا في مشاكل مع SSO. لدي current.discourse.example يستخدم sso.discourse.example كمضيف SSO. عندما تكون مسجّل الدخول، تُظهر قائمة المواضيع بشكل صحيح. لكن عندما تكون مجهولًا، لا تُظهر وتعرض الخطأ المذكور أعلاه. يُظهر عنوان URL /embed/topics?... صفحة فارغة.
أعتقد - أو أأمل - أن هذا يجب إصلاحه باستخدام:
Content-Security-Policy: frame-ancestors https://current.discourse.example https://sso.discourse.example;