المتصفح يمنع Discourse من العرض في iframe على الرغم من الإعداد الصحيح (`X-Frame-Options: SAMEORIGIN`)

مرحباً بالجميع،

لدينا نسخة من Discourse مضمنة في إطار iframe داخل تطبيقنا، وهي تعمل بشكل جيد على هذا النحو. ومع ذلك، عندما يحاول مستخدم غير مصادق الوصول إلى صفحة لا يملك حق الوصول إليها (إما أنها غير موجودة أو مقيدة بمجموعة)، فإن الاستجابة تتضمن الآن بشكل غامض X-Frame-Options: SAMEORIGIN وتمنع المتصفحات عرض الإطار.

لقد تحققت من إصدارات مختلفة بدءًا من 3.3.1 stable إلى أحدث إصدار تقريبًا (آخر اختبار كان في منتصف الأسبوع الماضي).

إنه يعمل على نطاق فرعي مختلف عن التطبيق الأصلي وتم تكوينه للتضمين مع allow_embedding_site_in_an_iframe: true ومن خلال تصحيح نسخة نظيفة، لاحظت أنه في مثل هذه الحالة، لا يتم استدعاء الدالة conditionally_allow_site_embedding في ApplicationController، وبالتالي تترك الرأس في الاستجابة (رابط GH)، وتتبعت ذلك إلى رمي استثناء في مرحلة ما وبالتالي كسر التدفق.

إعادة الإنتاج:

  1. قم بتشغيل نسخة نظيفة من Discourse (أو أي نسخة في الواقع - حدث هذا في البيئات المحلية والاختبارية والإنتاجية) وقم بتكوينها مع allow_embedding_site_in_an_iframe: true.
  2. قم بتضمينها في إطار iframe في موقع ويب يتم تقديمه عبر HTTPS باستخدام مسار غير موجود لتشغيل خطأ 404.

المتوقع: يسمح المتصفح بعرض Discourse.
الفعلي: يمنع المتصفح عرض Discourse بسبب وجود X-Frame-Options: SAMEORIGIN في الاستجابة.

ملاحظة جانبية: إنه يعمل من خلال Cloudflare فقط لنظام أسماء النطاقات (DNS) وحاولنا حذف الرأس في وضع الوكيل، ومع ذلك، لا يمكننا وضعه في وضع الوكيل بسبب قيام CF بتصفية ملفات تعريف الارتباط المطلوبة لتطبيق SSO المخصص الخاص بنا، لذا فهذا خيار غير متاح لنا في الوقت الحالي.