تعليقات "خطأ في التضمين"

TL;DR: يعرض Discourse رسالة “خطأ في التضمين” بغض النظر عن المضيفين الذين أسمح بهم في إعدادات التضمين.

لدي موقع منشور على foo.com يقوم بتضمين تعليقات من منتدى Discourse الموجود على forum.foo.com، ويعمل هذا بشكل جيد. عند الانتقال إلى عنوان مثل https://foo.com/blog/2019-11-22/foo-0.9.6-released، أرى التعليقات المضمنة بشكل صحيح. في هذه الحالة، يبدو كود السكربت الخاص بالتضمين في مصدر الصفحة كالتالي:

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

لدي أيضًا نسخة تطوير من الموقع تعمل على جهاز الكمبيوتر المحلي الخاص بي (localhost)، وأواجه فيها مشاكل في التضمين - حيث تستمر في إظهار رسالة “خطأ في التضمين” بدلاً من عرض التعليقات داخل HTML الذي يتم إنشاؤه وإرجاعه من المنتدى. أي أنني أرى شعار المنتدى ورابطًا إليه في الزاوية العلوية اليمنى من منطقة التضمين، لكن بدلاً من سرد التعليقات، أرى فقط رسالة الخطأ هذه.

عند الانتقال إلى عنوان مثل http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/، وهو الصفحة المكافئة للموقع المنتج، يبدو كود السكربت الخاص بالتضمين في مصدر الصفحة كالتالي:

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

جربت ذلك مع وجود شرطة مائلة (/) في نهاية إعداد discourseEmbedUrl وبدونها، ولم يفرق ذلك شيئًا.

لا أملك وصولاً مباشرًا إلى الخادم الذي يعمل عليه المنتدى، لكنني دخلت إلى لوحة تحكم المنتدى وحاولت إضافة مجموعة من المضيفين المسموح بهم في إعدادات التضمين. الإعدادات الحالية، للموقع المنتج الذي يعمل التضمين فيه بشكل صحيح، هي:

"المضيفون المسموح بهم"، "اسم الفئة"، "قائمة المسارات المسموح بها"، "النشر في التصنيف"

foo.com، <فارغ>، /blog/.*، blog

ما أضفته لجعله يعمل مع نسختي التطوير المحلية من الموقع هو:

"المضيفون المسموح بهم"، "اسم الفئة"، "قائمة المسارات المسموح بها"، "النشر في التصنيف"

localhost، <فارغ>، /blog/.*، blog
localhost:1313، <فارغ>، /blog/.*، blog
<عنوان IP الخارجي/العام كما يراه خادم المنتدى>، <فارغ>، /blog/.*، blog
<عنوان IP الخارجي/العام كما يراه خادم المنتدى>:1313، <فارغ>، /blog/.*، blog

لكن لا شيء من ذلك يجعلها تعمل، فأنا ما زلت أحصل على نفس رسالة “خطأ في التضمين”.

أتردد في الغوص في الكود المصدري ومحاولة تصحيح هذا الخطأ، وأفضل الحصول على بعض التوضيحات حول ما يتحقق منه Discourse عندما يقرر توليد رسالة الخطأ هذه. هل يمكن لأحد إخباري بذلك، وكيفية إصلاح هذا؟ يجب أن يكون الأمر مباشرًا إلى حد ما، لكن Discourse يتصرف هنا كصندوق أسود.

لقد قرأت كل ما ورد في Embed Discourse comments on another website via Javascript لكنها لا تقدم معلومات أكثر فائدة.

قد ترغب في استخدام topicID كما هو مذكور في Embed Discourse comments on another website via Javascript.

لن أكون مستغربًا إذا كان “localhost” ممنوعًا لأسباب مختلفة. هذا سيجعل خادم المنتدى الخاص بك يقوم بالتضمين على نفسه. :dizzy_face:

إذا كنت تستخدم Hugo، فربما يمكنك تحميل قالب التعليقات بشكل مشروط، أو تمرير baseURL صراحةً في القالب، بحيث حتى أثناء التطوير ستقوم بتحميل discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'.

@maiki شكرًا جزيلاً لك على تخصيص الوقت للرد.

استخدام topicId كما هو موضح في الدليل لا يجعل الأمر يعمل ولا يغير أي أعراض. بالطبع، يتغير الرابط المطلوب إلى https://forum.foo.com/embed/comments?topic_id=2279 بدلاً من ذلك، لكنه يعطي رسالة الخطأ نفسها تمامًا.

لقد جربت أيضًا تغيير discourseEmbedUrl إلى https://foo.com/blog/2019-11-22/foo-0.9.6-released، لكن هذا أيضًا لم يحسن أي شيء للأسف.

حتى لو كان الأمر مقصودًا، فيجب توثيقه. على سبيل المثال، هل الطلبات من موقع محلي (localhost) محظورة؟ على الرغم من أنها مدرجة صراحةً في المضيفين المسموح بهم؟ هل ينظر Discourse إلى حقل الإحالة (referrer) في طلب HTTP، أم ما هو بالضبط ما يستخدمه لتفعيل هذا الخطأ؟ هذا يحتاج حقًا إلى توضيح، لأنه حتى الآن لم أجد أي شيء يفسر سبب عدم عمله :slight_smile:

ما هي رسالة الخطأ؟ هل هناك أي شيء في وحدة تحكم المطور؟

localhost ليس نطاقًا صالحًا، بل هو اسم مضيف.

لست متأكدًا من أنه من المنطقي شرح ذلك في دليل التضمين، لكن على الأقل لدينا هذا الموضوع للرجوع إليه! :slight_smile:

لا، لا يوجد أي خطأ في وحدة تحكم المطور على عميل/متصفح localhost. يتم إرجاع HTML بنجاح من خادم المنتدى، ويمكنني رؤيته بوضوح في أدوات المطور.

إليك كيف يجب أن يبدو عندما يعمل بشكل صحيح (تم تغطية بعض النصوص):

وهكذا يبدو في الواقع (تم تغطية بعض النصوص):

إذًا، المشكلة هي أن خادم المنتدى يعيد رمز الحالة 400 ورسالة “خطأ في التضمين” بدلاً من المحتوى الصحيح.

بالتأكيد، ولكن كما اقترحت، ربما يقوم Discourse بحظر هذا النوع من الطلبات من المراجعين (referrers) الذين ينتمون إلى localhost. أنا أعرف أن “localhost” ليس اسم نطاق بل اسم مضيف. وهذا يتوافق مع حقيقة أن ما تقوم بتكوينه في إعدادات “المضيفات المسموح بها” في إعدادات التضمين في المنتدى هو مجرد ذلك، أي مضيفات.

أعرف تمامًا ما هو localhost، هذه ليست مشكلة.

شرح ما هو localhost؟ لا، هذا غير ضروري. عندما قلت إنه يجب أن نصل إلى استنتاج حول سبب عدم عمله بالنسبة لي، وأنه يجب توثيق ذلك، كنت أتحدث بشكل عام عن سبب عدم توقع أن يعمل هذا، إذا كان الأمر كذلك. مرة أخرى، كما هو الحال الآن، لا يوجد ما يشير إلى أن هذا هو السلوك المتوقع.

هل تم ضبط موقع Discourse الخاص بك على “تسجيل الدخول مطلوب”؟

إعداد “تسجيل الدخول مطلوب” في قسم “تسجيل الدخول” غير محدد، لذا لا، لم يتم ضبطه.

بالتفكير بصوت عالٍ: ما الذي يختلف عندما يأتي الطلب من موقع التطوير المحلي الخاص بي، وعندما يأتي من موقع الإنتاج، ليس كثيرًا. يجب أن يكون الأمر مجرد مرجع HTTP ومصدر طلب HTTP بالطبع. بخلاف ذلك، أنا أستخدم نفس المتصفح لكلا الموقعين.

يمكنك اختبار ما إذا كانت المشكلة في الخادم من خلال محاولة تضمينه في نطاق حي آخر (ربما نطاق فرعي لنطاق تملكه).

أفكر بصوت عالٍ: إذا طلبت من Discourse قبول “localhost”، فسيبحث عنه في localhost، وهو خادم Discourse.

حظًا موفقًا! لا أعرف ما الذي يحدث. :slight_smile:

أفهم منطقك. هنا يصبح من المثير للاهتمام معرفة ما يفحصه فعليًا عند تحديد الوصول، وما إذا كان يجب أن يُظهر رسالة الخطأ هذه أم لا.

وفي سياق ذي صلة، المشكلة تكمن في أن النظام (Discourse، عند الرد على الطلب المدمج) يُرجع رمز استجابة HTTP 400، وهو ما يعني ببساطة “طلب غير صالح”. لو كان الأمر يتعلق بمضيف غير مسموح به أو ما شابه، لكانت تتوقع أن يكون الرمز 401 (“غير مصرّح”) أو ما يشابهه، لكن هذا ليس هو الحال. وهذا يشير إلى أن الأمر لا يتعلق بالصلاحية أو المضيفين المسموح بهم. لكن من الممكن أيضًا أن يكون الكود الخلفي ببساطة لا يُرجع رمز استجابة HTTP صحيحًا.

بالتأكيد، يجب أن يعرف شخص ما ما إذا كان من الممكن تضمين التعليقات من نطاق forum.foo.com من موقع تطوير محلي (localhost). لا أرى أي شيء يشير إلى أن هذا لا يجب أن يعمل (من خلال السماح بالمضيفين)، ولكن بما أنه لا يعمل، فإن الأمر غير واضح إلى حد ما.

يبدو أن هناك أمرًا أكبر يحدث.
تم تعيين رؤوس X-Frame-Options على ALLOWALL.
لكن ALLOWALL ليس خيارًا متاحًا، راجع X-Frame-Options header - HTTP | MDN
عند محاولة تضمين التعليقات، أحصل على الخطأ التالي: تم العثور على رأس X-Frame-Options غير صالح عند التحميل ... 'ALLOWALL' ليس إرشادًا صالحًا
فقط عند استخدام topicId يتم تحميل التعليقات. لكنني أعتقد أن ذلك لأنك لا تحتاج إلى الإذن الكامل عند تضمين التعليقات فقط.

شكرًا لك على الإبلاغ عن ذلك. ما هو المتصفح الذي تظهر فيه هذه المشكلة؟ هل المتصفح محدث؟

إنه يعمل على فايرفوكس وهو محدّث، لقد تحققت من كروم لكنه لم يُظهر لي أي خطأ، بل ببساطة لم يعمل.

في حال كان هناك أي شخص مهتم، فقد وصفت مثيلتي للمشكلة بالتفصيل سابقًا، ولأي سبب كان، فإن تضمين التعليقات عمل بشكل ممتاز عندما نشرنا الموقع أخيرًا.

أي أن المشكلة والأعراض التي وصفتها سابقًا كانت تحدث عندما كنت أشغل الموقع الذي يضمن التعليقات من forum.domain.com على نظامي الخاص مثل localhost أو ما شابه. لكن عند نشر الموقع إلى domain.com، عمل مباشرة.

وكما قلت سابقًا، لا يمكنني العثور على أي شيء في إعدادات المنتدى يمنع الوصول إلى أو تضمين التعليقات من مصادر أخرى غير domain.com، لذا فإن سبب عدم عملها لا يزال لغزًا بالنسبة لي. يجب أن يكون هناك شيء في كود Discourse يمنع ذلك، لكنني لا أعرف ما هو.

لقد حاولت إعادة إنتاج هذه المشكلة، لكنني لم أتمكن منها حتى الآن. باستخدام سكريبت التضمين الافتراضي، تظهر التعليقات لدي دون أخطاء في كل من متصفحي Chrome و Firefox الأحدث (العاملة على Ubuntu).

من الأمور الأخرى التي يجب التحقق منها التأكد من أنك قد أنشأت سجل المضيف في قسم الإدارة / التخصيص / التضمين في موقعك. أذكر هذا لأنني واجهت خطأً أثناء الاختبار لأنني لم أكمل إعداد “اسم المستخدم لإنشاء الموضوع” ولم أحفظ إعدادات التضمين.

كنت أواجه مشكلة مماثلة أعتقد، وقمت بإصلاحها عن طريق تغيير المضيفين المسموح بهم (Allowed Hosts) في المسؤول (Admin) > تخصيص (Customize) > تضمين (Embedding) من example.com إلى www.example.com وعمل ذلك. لدي المنتدى مثبت على subdomain.example.com وربما لهذا السبب كان يسبب مشاكل.

على أي حال، لست متأكدًا مما إذا كان ذلك سيساعدك، ولكني آمل أن يفعل ذلك!