أنواع mime غير صحيحة (رأس المحتوى) لملف mp4 وjs

مرحباً!

لقد لاحظت للتو أن 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.

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

فتح ملف فيديو مستضاف على Discourse يجبر على تنزيل الفيديو بدلاً من تشغيله في المتصفح.

انقر بزر الماوس الأيمن، وانسخ عنوان الفيديو، والصق الرابط في شريط عنوان المتصفح.

الشيء الغريب هو أنه في تثبيت تطوير محلي، فإنه يشغل الفيديو بشكل صحيح في المتصفح:

عند تحميل عنوان URL للفيديو، تختلف الرؤوس بين تثبيت عادي وتثبيت تطوير.

في التثبيت الإنتاجي العادي، يتم تعيين نوع محتوى الفيديو إلى application/mp4، بينما يتم تعيينه إلى video/mp4 في تثبيت التطوير.

إعادة نشر Discourse send PDF inline لأن المؤلف أصلح سلوكًا غير مرغوب فيه مشابهًا مع ملفات PDF.

أنا مستعد للاستماع إذا كان لدى أي شخص حل لمنع تنزيل ملفات mp4 بالقوة.

4 إعجابات

يا له من اكتشاف جيد - هذا غريب.

يبدو أن MiniMime (مكتبة نستخدمها ونملكها) قد تعيد هذه القيم

pry(main)> MiniMime.lookup_by_filename("a.mp4").content_type
=> "application/mp4"

https://github.com/discourse/mini_mime/blob/574c3bee73eba30dc388f3dc0225311dcf303770/lib/db/ext_mime.db#L548-L550

سأقوم بإنشاء طلب سحب (PR) وسنناقش ما إذا كانت هناك مشكلة في تغيير هذه.

5 إعجابات

تحديث سريع فقط -

ext_mime_db أعلاه الذي نستخدمه يتبع أنواع وسائط IANA Media Types المعرفة هنا - https://www.iana.org/assignments/media-types/media-types.xhtml. للأسف، هذا يعني أن mp4 هو بشكل صحيح application/mp4 :sweat_smile:


على الرغم من ذلك، بالنظر إلى تطبيق S3 uploader الخاص بنا بشكل أعمق، أرى أننا نضيف رأس Content-Disposition \"attachment\" لكل تحميل تقريبًا ليس صورة، ولكن يبدو أنه كان مخصصًا فقط لملفات svgs. استخدام \"attachment\" سيؤدي إلى تنزيل المحتوى بدلاً من فتحه في علامة تبويب جديدة. بالنسبة لمقاطع الفيديو، فهو مزيج من application/video و attachment هو ما يسبب هذا.

يمكننا على الأقل إزالة هذا الرأس، أعتقد.

إعجابَين (2)

لست متأكدًا من أنني أفهم تمامًا، لذا سؤال سريع بخصوص طلب السحب هذا :person_raising_hand:

لماذا تستهدف التعديلات ملفات متعلقة بـ s3 تحديدًا، عندما يحدث التنزيل القسري حتى عند عدم استخدام s3؟ :thinking:

هل سيؤدي ذلك إلى إصلاح المشكلة بشكل عام على أي حال؟
هل سيؤدي أيضًا إلى إصلاح التنزيل القسري لملفات أخرى يمكن فتحها في المتصفح مثل ملفات PDF؟

عند التحميل إلى 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).

إعجابَين (2)