بالنسبة لي يبدو هذا كخلل برمجي، لكن في هذه الحالة كان من المفترض أن أرى موضوعًا عن ذلك هنا. لذا إذا كان منتدائي هو الوحيد الذي يعاني من هذه المشكلة، فربما يكون الخلل من جهتي.
على أي حال.
مستخدمو أندرويد عندي لا يمكنهم رؤية لوحة المفاتيح الافتراضية عند استخدام محرر النص الغني. عند التحويل إلى Markdown يعمل كل شيء بشكل سليم. أما أجهزة iPad وiPhone (عبر Safari/PWA، وDiscourseHub) فتبقى عالقة في وضع Markdown ولا يمكنها التحويل إلى محرر النص الغني (RTE).
بدأت هذه المشكلة قبل يومين على ما أظن. مستخدمو منتدائي يميلون إلى الانتظار قبل أن يخبروني بأن شيئًا ما معطوب.
ما الذي يمكنني فعله بعد ذلك… استضافة ذاتية، حاويتان، على أحدث إصدارات وأقوم بالترقية يوميًا، وأحدث إصدار كان عمره 20 دقيقة فقط وقت كتابة هذا الموضوع، ووضع الآمان لا يفيد.
ما خطوتي التالية؟ لا يمكنني الوصول إلى وحدة التحكم (Console) أو الاطلاع على الأخطاء المحتملة على الأجهزة المحمولة.
(index):1 Access to script at 'https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js' from origin 'https://foorumi.katiska.eu' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
prosemirror-editor-opfbo6zd.digested.js:1 GET https://cdnfoorumi.katiska.eu/assets/br/chunk-coedl1gv.digested.js net::ERR_FAILED 200 (OK)
d-editor.gjs:212 Uncaught (in promise) TypeError: Failed to fetch dynamically imported module: https://cdnfoorumi.katiska.eu/assets/br/prosemirror-editor-opfbo6zd.digested.js
Prosemirror هو محرر النصوص الغني (RTEditor). لكنني لا أستطيع تقديم مساعدة أكثر من مشاركة رسالة الخطأ التي أراها.
خارج الموضوع: شكرًا على الضحك بسبب تصنيف «قبلات وحيوانات» (للأسف الترجمة الإنجليزية تقول «قطط» بدلاً من ذلك، لذا سألتزم بالترجمة الألمانية )
لا أفهم ما أراه هنا، لكن هل المشكلة تكمن في S3 وإعداداتي هناك؟ وإذا كان الأمر كذلك، فلماذا بدأ هذا مؤخرًا؟ قد يكون أحد الأعراض هو أنني منذ الأمس لم أعد قادرًا على كتابة أي ملاحظات على اللوحات (boards-notes).
لكن إذا كان CORS هو المشكلة، فلماذا تتأثر هذه العناصر فقط؟
—
لماذا، باسم الآلهة القدماء والجُدد، استخدم الذكاء الاصطناعي كلمة Küsse في هذا السياق
لا أعتقد أن هناك أي تغييرات حديثة في Discourse تسببت في هذه المشكلة. ومع ذلك، يعاني S3 من سلوك غريب طويل الأمد فيما يتعلق بـ CORS، مما قد يؤدي إلى تخزين CDN لنسخة من الأصل (asset) بدون ترويسة Access-Control-Allow-Origin. وإذا كان الأمر يتعلق بمشكلة تخزين مؤقت (bad-cache)، فقد يفسر ذلك لماذا يؤثر الأمر على بعض مستخدميك فقط (على الأرجح بناءً على موقعهم الجغرافي).
كما أذكر - لن يقدّم S3 ترويسة Access-Control-Allow-Origin إلا للطلبات التي ترسل ترويسة Origin (أي تلك الصادرة عن متصفح ويب عادي). وعند إغفال Access-Control-Allow-Origin، لا يقدم S3 ترويسة Vary: origin في استجابته. وبالتالي: إذا كان الطلب الأول لمعطى الأصل (asset) صادراً عن سياق غير متصفح ويب (مثل curl، أو أحد الزواحف الويب)، فقد يخزّن CDN النسخة التي لا تحتوي على ترويسة CORS. أمر مزعج جداً!
الإعداد DISCOURSE_CORS لن يكون مفيداً على الإطلاق هنا. فهو ذو صلة بخادم التطبيق فقط، وليس بـ S3.
في استضافتنا، نتعامل مع هذه المشكلة من خلال تكوين Cloudfront لإضافة Access-Control-Allow-Origin: * إلى جميع الاستجابات. وهذا يضمن أن السلوك الغريب لـ S3 لا يمكنه التسبب في تخزين نتيجة خاطئة.
بديل لذلك، يمكنك تكوين Cloudfront لتضمين ترويسة طلب Origin في مفتاح التخزين المؤقت (cache key)، مما سيحافظ على فصل الاستجابات غير الداعمة لـ CORS عن الاستجابات الداعمة لها.
توجد لدى أمازون مجموعة من الوثائق حول CORS هنا. كان لدي هذا الرابط في ملاحظاتي، والذي يبدو أنه موضوع في منتدى حول هذه المشكلة تحديداً… لكن يبدو أنهم حذفوه
أولاً، قمت بحذف جميع الإشارات إلى S3 من ملف web_only.yml. ثم قمت بإعادة البناء (Rebuild) ولأغراض الأمان شغّلت الأمر rake posts:rebake. اختفت المشاكل، لكن الصور كانت لا تزال تُحمَّل عبر CDN. أعدت تفعيل S3 فعادت المشكلة.
فتحت لوحة AWS وطلعت على إعدادات distribution في CloudFront. كان لديّ هناك نطاق (domain) قديم يعود إلى ما يقارب 3 سنوات على الأقل، وقد تغيّر توب-ليفل دومين (TLD) الخاص به. أدهشني أن أي شيء كان يعمل أصلًا. عدّلت الإعدادات وفقًا لتوصيات CloudFront، وفي مرحلة ما أضفت أيضًا access-control-allow-origin: * (وهو أمر غبي لأنه يجعل CORS بلا فائدة). ومع ذلك، فهمي هو أن هذا الترويسة (header) كانت تُقدَّم بالفعل عبر CloudFront.
ولأغراض الأمان، قمت بإعادة البناء مرة أخرى ثم أجريت الاختبار. لم يُجدِ نفعًا.
بما أنه من الممكن أن يكون الكاش (Cache) هو السبب، قمت بإبطال (Invalidate) المسار /assets/* ولأغراض الأمان أيضًا /assets/br/*. ثم قمت بإعادة البناء مرة أخرى، وتمت إصلاح المشكلة.
تم إصلاح مشكلة أخرى أيضًا. كنت أعاني منذ الصيف من مشكلة Oops… أي خطأ 50x بعد إعادة البناء. عندما أفعل وضع الأمان (Safe Mode) وأعطّل القوالب (Themes)، أستطيع الوصول إلى لوحة الإدارة. يجب عليّ تعطيل أكثر من 20 مكوّنًا (TC) حتى يستيقظ المنتدى. بعد ذلك، أستطيع تفعيل تلك المكونات ويعمل كل شيء مرة أخرى.
إذن، هل يمكننا استخلاص استنتاج مفاده أن كل هذا نشأ عن مشاكل في AWS CloudFront؟
الشيء المتعلق بـ Oops مُفاجئ إلى حد كبير - لم أكن أتوقع أن يكون له علاقة بـ Cloudfront… لكن إذا تم إصلاحه الآن… رائع!
إنه يعني ببساطة «أنه مسموح باستخدام هذا المورد من سياق عبر المواقع». على الأرجح، لن ترغب في وجود هذا الترويسة في استجابات HTTP الخاصة بالمنتدى الفعلي. لكن بالنسبة للموارد الثابتة، التي لا تتطلب مصادقة ولا تحتوي على أي معلومات خاصة، فهذا أمر مقبول تمامًا. إنها بالضبط الطريقة التي يُفترض أن يُستخدم بها نظام CORS - لتسمح للسيرفرات بالتحكم الانتقائي في أي الاستجابات يجب أن تكون متاحة عبر المواقع.
إذا كنت ترغب حقًا في ذلك، يمكنك ضبط Access-Control-Allow-Origin: my-forum.example.com. لكن ستواجه مشاكل إذا قمت بتغيير نطاق المنتدى الخاص بك في أي وقت.