تضمين JavaScript لن يعرض التضمين، يظهر سجل وحدة التحكم: فشل في تنفيذ postMessage على DOMWindow…

مرحباً، لدي نفس الخطأ تماماً عند محاولة دمج تضمين JavaScript في موقعنا.

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

[تعديل] بما أنني لا أريد عرض رسالة الخطأ هذه طوال الوقت، فقد قمت بتفعيلها في منشور قديم واحد فقط.

إعدادات التضمين:

الإعدادات التي جربتها:

host: royaleapi.com
path allowed: /blog/.*

host: royaleapi.com
path allowed: 

لقد قمت أيضاً بتفعيل CORS origin لهذه النطاقات:

  • https://royaleapi.com
  • https://cdn.royaleapi.com

وأضفت أيضاً DISCOURSE_ENABLE_CORS: true في المتغيرات البيئية داخل ملف app.yml، لذا أنا عالق قليلاً هنا…

هل أنت متأكد من أن معامل الاستعلام ?discuss=1 ليس هو سبب المشكلة؟

هل توجد أي أذونات أمان على فئة المدونة الخاصة بك، أم أنها مضبوطة للسماح لمجموعة “الجميع” بإنشاء الردود / الرد عليها / المشاهدة؟

ما هي نسخة Discourse التي يعمل عليها موقعك؟

أيضًا، ما هي رسالة الخطأ الكاملة التي تظهر بعد نص Failed to execute postMessage on DOMWindow؟ أتوقع أن تكون شيئًا مثل The target origin provided (<target_url>) does not match the recipient window's origin (<origin_url>).

أنا متأكد من أن الأمر لا علاقة له بمعلمة ?discuss=1. لقد واجهت نفس المشكلة دونها، لكن الموقع يعمل مباشرةً ولا أريد إظهار كتلة خطأ ضخمة لمستخدمينا. ولكن بما أنك طلبت، فقد قمت بتعديل الموقع وقمت بتفعيل تضمين JavaScript في واحدة فقط من مشاركاتنا القديمة جدًا حيث لا يتوقع وجود زوار. إذن لا توجد سلسلة استعلام. (لقد قمت بتحديث منشوري الأول ليعكس هذا)

https://royaleapi.com/blog/season3

https://royaleapi.com/blog/season3

إصدار Discourse

2.6.0.beta5

إصدار نظام التشغيل

Ubuntu 20.04.1 LTS

رسالة الخطأ الكاملة

VM469 embed-application-9cef8308c816fc1d83137e63d6c556c6cc2b68fe2b6e5ce16cca6766ba2c0ae4.js:1 فشل تنفيذ ‘postMessage’ على ‘DOMWindow’: الأصل المستهدف المقدم (‘https://discuss.royaleapi.com’) لا يتطابق مع أصل نافذة المستلم (‘https://royaleapi.com’).

فئة المدونة

هذه فئة عامة مفتوحة للجميع. لقد جعلتها كذلك بالفعل، لذا لا توجد مشاركات. لقد أنشأت منشورًا جديدًا الآن لأرى ما إذا كان وجود عنصر واحد في الفئة مطلوبًا.

لقطة شاشة: سطح المكتب

لقطة شاشة: الجوال

إعجاب واحد (1)

غير متأكد مما إذا كان هذا قد يكون ذا صلة، لكنني أرى بعض الأخطاء في السجلات، غير أنني غير متأكد مما هي:

[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] لم تتغير النطاقات.
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] تم التجاوز، وقت التجديد التالي هو: الاثنين 04 يناير 2021 08:07:59 ص ت ع م
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] أضف '--force' لإجبار التجديد.
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] جاري تثبيت المفتاح إلى:/shared/ssl/discuss.royaleapi.com_ecc.key
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] جاري تثبيت سلسلة الشهادات الكاملة إلى:/shared/ssl/discuss.royaleapi.com_ecc.cer
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] تنفيذ أمر إعادة التحميل: sv reload nginx
تحذير: nginx: غير قادر على فتح supervise/ok: الملف غير موجود
[الجمعة 06 نوفمبر 2020 04:47:14 م ت ع م] خطأ في إعادة التحميل لـ :
تم بدء runsvdir، معرف العملية هو 663
ok: run: redis: (معرف العملية 677) 0 ثوانٍ
chgrp: مجموعة غير صالحة: 'syslog'
ok: run: postgres: (معرف العملية 675) 0 ثوانٍ
rsyslogd: imklog: غير قادر على فتح سجل النواة (/proc/kmsg): العملية غير مسموح بها.
rsyslogd: فشل تفعيل وحدة imklog [v8.1901.0 جرب https://www.rsyslog.com/e/2145 ]
معرف عملية supervisor: 671 معرف عملية unicorn: 702

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

@سيمون، هل يمكنك مساعدتي في هذا الأمر؟ هل هذا السلوك متوقع أم سيتم إصلاحه في إصدار مستقبلي؟

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

شكرًا لك!

هناك مشكلة لم ألاحظها سابقًا في هذه الصورة:

قائمة السماح بالمسارات مُضبوطة على /blog/* بدلاً من /blog/.* (لاحظ إضافة النقطة).

جرّب تعديل إدخال المضيف لتغيير قائمة السماح بالمسارات إلى /blog/.*.

إذا لم تحل هذه المشكلة، جرّب /.*. كما يمكنك أيضًا ترك الإعداد فارغًا.

إعجاب واحد (1)

نعم، كانت لقطة الشاشة لدي تظهر المشكلة، لكنني قمت بتغييرها إلى /blog/.* بالفعل بعد أن أدركت أنها تستخدم على الأرجح تعبيرًا نمطيًا. ومع ذلك، لا تزال المشكلة قائمة.

@simon لقد جربت جميع الخيارات الثلاثة:

/blog/.*
/.*

(الخيار الأخير فارغ) ولا يعمل أي منها.

يبدو أن الخطأ الذي ظهر في وحدة التحكم يشبه مشكلة CORS أكثر من أي شيء آخر.

_embed-application-9cef8308c816fc1d83137e63d6c556c6cc2b68fe2b6e5ce16cca6766ba2c0ae4.js:7 
فشل تنفيذ 'postMessage' على 'DOMWindow': 
الأصل المستهدف المقدم ('https://discuss.royaleapi.com') 
لا يتطابق مع أصل نافذة المستلم ('https://royaleapi.com').

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

  DISCOURSE_ENABLE_CORS: true
  DISCOURSE_CORS_ORIGIN: '*'

مما يجعله مفتوحًا بالكامل، لكن هذا لا يعمل أيضًا.

في صفحة إعدادات تضمين Discourse، هل قمت بتعيين إعداد “اسم المستخدم لإنشاء المواضيع”؟ إذا لم يتم تعيينه، فستحصل على خطأ “فشل تنفيذ postMessage على DOMWindow”.

إعجاب واحد (1)

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

من المثير للاهتمام، أنني وجدت اليوم ما يلي:

curl -IXGET https://discuss.royaleapi.com

access-control-allow-origin: *
access-control-allow-headers: Content-Type, Cache-Control, X-Requested-With, 	X-CSRF-Token, Discourse-Present, User-Api-Key, User-Api-Client-Id, Authorization
access-control-allow-credentials: true
[تم اختصاره]

ومع ذلك:

curl -IXGET https://discuss.royaleapi.com/javascripts/embed.js

HTTP/2 200
server: nginx
date: Tue, 08 Dec 2020 23:52:26 GMT
content-type: application/javascript
content-length: 2404
last-modified: Tue, 01 Dec 2020 01:49:39 GMT
vary: Accept-Encoding
expires: Wed, 09 Dec 2020 23:52:26 GMT
cache-control: max-age=86400
cache-control: public,immutable
accept-ranges: bytes

هل يمكن أن يكون هذا هو السبب؟ يبدو إذن أن النصوص البرمجية نفسها لا تحتوي على رؤوس access-control-allow-origin على الرغم من أن النطاق يحتوي عليها. هل يجب أن أحاول استخدام إعدادات nginx الخاصة بي وعدم استخدام ما هو مدمج في صورة docker؟

@سيمون لقد حللت هذه المشكلة.

من أجل حل مشكلة أخرى Unable to generate preview for URLs - #4 by seeminglee — قمت بتفعيل طلبات HEAD على الموقع، والآن ظهرت جميع المناقشات، وبناءً على ذلك، تم إنشاء الموضوعات تلقائيًا لمنشورات مدونتي.

هذا مذهل — لا أستطيع تصديق أنني دخلت في متاهة محاولة تحديد ما إذا كانت المشكلة متعلقة بـ CORS بينما هي في الواقع تتعلق بطلبات HEAD. ربما يجب تحديد ذلك في مكان ما في الوثائق.

يرجى اعتبار هذه المشكلة مغلقة.

إعجابَين (2)

شكرًا جزيلاً لمتابعتك هذا الأمر!

ربما ينبغي إضافة هذا إلى قسم استكشاف الأخطاء وإصلاحها في Embed Discourse comments on another website via Javascript. لست متأكدًا من مدى شيوع تعطيل طلبات HEAD، لكنها مشكلة صعبة التتبع في المواقع التي تم فيها تعطيلها.

إعجاب واحد (1)

حسناً، إذا بذلت جهداً لحظر طلبات HEAD لعناوين URL تستجيب لطلبات GET وتنتهك RFC، فمن المتوقع حدوث بعض الأعطال، أليس كذلك؟

بصراحة، لم أكن أدرك أن هناك خدمات تعتمد على وجوده. لم كنتُ سأقوم بـ “تعطيل” الدالة لو كنتُ أعرف أنها مطلوبة.

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

إعجابَين (2)

في الواقع، يُظهر @فالكو أن مجرد تشغيل الأمر

curl https://example.com/path/to -I

سيوضح ما إذا كانت الطريقة مُطبَّقة. يبدو هذا طريقة جيدة للتحقق من ذلك.

على أي حال، نقدر حقًا مساعدتكم يا صاحبي!

إعجابَين (2)

آسف على ذلك. أعتقد أن أطر العمل مثل Rails جعلتني معتادًا لدرجة أنني أتوقع أن يكون هذا افتراضيًا جاهزًا للاستخدام فورًا للمواقع الإلكترونية :sweat_smile:

إعجابَين (2)

نعم، من فضلك: قم بتحديث قسم استكشاف الأخطاء وإصلاحها بهذا. أنا عالق في مشاكل أمان CORS/الإطار، وأرجو أن يساعد اتباع خطوات المستخدم @seeminglee. كيف يمكنني تمكين طلبات HEAD؟

@willywongi قد يكون هناك لبس بشأن مشكلتي، لذا دعني أشرح ما حدث.

  1. اتبعت الخطوات لكنني لم أستطع دمج التعليقات في الموقع.
  2. اتضح أن تطبيق Discourse الخاص بي (المُثبَّت على نطاق مختلف) غير قادر على «التحقق» من وجود منشورات مدونتي لأن موقعي الرئيسي لم يُنفّذ طريقة HEAD على تلك الروابط.
  3. بعد تنفيذ معالج لطلبات HEAD لتلك المسارات، عمل الدمج بنجاح.

للتحقق مما إذا كانت لديك نفس مشكلتي، قم بتشغيل أمر curl ضد الرابط الذي يحتوي على منشور المدونة / أو حيث تريد ظهور تضمين التعليقات.

على سبيل المثال، إذا كان رابطك هو https://example.com/blog/awesome-post، انتقل إلى طرفية الأوامر (Terminal) وقم بتشغيل:

curl https://example.com/blog/awesome-post -I

سيقوم هذا الأمر بإرسال طلب HEAD إلى ذلك الرابط ويعطيك النتيجة. إذا كان رمز الحالة أي شيء غير 200 (وهو الرقم في السطر الأول من الاستجابة)، مثل:

HTTP/2 200

فإن الخادم لا يُنفّذ طريقة HEAD (أو أن هناك مشكلة في الاستجابة لها).

إذا كانت الاستجابة هي 200، فإن مشكلة الدمج لا علاقة لها بطلبات HEAD.

إعجاب واحد (1)

ها، أصبح الأمر واضحًا الآن! شكرًا لك.
تحققت من طريقة HEAD، وقد استجاب موقعي لها بشكل صحيح (200).

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

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

إعجاب واحد (1)