لقد لاحظت للتو أن discourse يضع رؤوس Content-type غير صحيحة للعديد من أنواع الملفات: ملفات mp4 من /uploads/ تأتي مع content-type: application/mp4 بدلاً من video/mp4
تم تحميل ملفاتي من S3 لذا يعود الأمر لمزود استضافة S3.
بعض ملفات javascript (.js) على سبيل المثال من /brotli_asset/ تأتي مع application/javascript بدلاً من text/javascript.
أنا أستخدم discourse_docker بدون أي تعديلات، لقد تحققت من nginx المضمن، فهو يحتوي على ملف تكوين mime-types الصحيح. يبدو أن الواجهة الخلفية لـ discourse هي المسؤولة عن إرسال هذه mime-types غير الصحيحة.
مرحباً! على حد علمي، كانت المشكلة المتعلقة بالتحميلات من جانبي وتسببت بها مزود S3 (لقد قمت بحلها بنجاح عن طريق تجاوز الإعداد في nginx الخاص بي). والمشكلة المتعلقة بـ JS من /brotli_asset/ هي في مكان ما في nginx “الداخلي” لـ discourse، لذا يبدو أنها خطأ في discourse_docker.
يؤسفني، لكنني فشلت في العثور على أي مكان للإبلاغ عن خطأ أفضل من هذا الجزء من المنتدى. هل يمكنك توجيهي من فضلك؟
باختصار، يرسل ديسكورس جافاسكريبت من موقع مختلف بأنواع MIME مختلفة. على سبيل المثال، يذهب /theme-javascripts/ff3c633d0d4192c83a194066eaa9d823b5c2d8f6.js مع text/javascript (صحيح) و /brotli_asset/... المذكور سابقًا مع application/javascript. يمكن أن يؤدي ذلك إلى إرباك خوادم البروكسي بين ديسكورس والعميل، وكذلك أنظمة التحليل، حيث لاحظت المشكلة.
يبدو أنك تحتاج فقط إلى إعداد nginx الداخلي بشكل صحيح في صورة ديسكورس Docker لأصول brotli.
في لوحة معلومات أنواع MIME لتقارير goaccess الخاصة بي، يتم تقسيم قيم discourse لـ js: واحدة لـ text/javascript وأخرى لـ application/javascript.
الثانية: يتم تشغيل كل من توجيهات gzip_types و brotli_types في nginx بواسطة أنواع MIME. لذلك، بالنسبة لـ discourse، يتعين على الأشخاص إعداد كل من text/javascript الصحيح و application/javascript غير الصحيح.
نفس الشيء لأي وكيل يعيد ضغط المحتوى الذي يعتمد على نوع MIME.
على الرغم من ذلك، بالنظر إلى تطبيق S3 uploader الخاص بنا بشكل أعمق، أرى أننا نضيف رأس Content-Disposition\"attachment\" لكل تحميل تقريبًا ليس صورة، ولكن يبدو أنه كان مخصصًا فقط لملفات svgs. استخدام \"attachment\" سيؤدي إلى تنزيل المحتوى بدلاً من فتحه في علامة تبويب جديدة. بالنسبة لمقاطع الفيديو، فهو مزيج من application/video و attachment هو ما يسبب هذا.
عند التحميل إلى S3، يجب علينا تحديد رؤوس مثل Content-Disposition و Content-Type للملف. هذه هي القيم التي سيتم إرجاعها عند تحميل الملف - PutObject - Amazon Simple Storage Service
هل يمكنك شرح متى يحدث هذا؟
سيقوم طلب السحب (PR) بإزالة رأس Content-Disposition: attachment الذي يجبر التنزيل بغض النظر عن المتصفح الذي تستخدمه.
بمجرد ترقية موقعك، يتم استخدام Content-Type بدلاً من ذلك، وسيقرر المتصفح ما يجب فعله به. هناك شيء واحد يجب ملاحظته، لا توجد مشكلة مع Content-Type: application/mp4 على Safari و Firefox، ولكن على Chrome، لا يزال يجبر التنزيل (ربما بسبب بعض التاريخ السيئ الذي يمتلكه Chrome مع نوع ملف mp4).