أنواع MIME

ابحث في جدول مرجعي لامتدادات الملفات الشائعة وأنواع MIME الخاصة بها وفق IANA، مفلترًا حسب الفئة العليا، لضبط رأس Content-Type الصحيح في كل مرة.

أي رأس Content-Type يحتاجه هذا الملف؟ اكتب امتدادًا مثل .webp أو جزءًا من نوع وسائط مثل image لتصفية الجدول. يتبع كل إدخال سجل أنواع الوسائط في IANA وقائمة الأنواع الشائعة في MDN.

المطابقات
الامتداد نوع MIME

ماذا يخبر نوع MIME المتصفح

تشريح نوع الوسائط

نوع MIME - أو بشكل أدق نوع الوسائط - هو التسمية التي يرفقها الخادم بالاستجابة ليعرف العميل كيف يتعامل مع البايتات التي تليها. له جزءان مفصولان بشرطة مائلة: نوع عليا مثل text أو image أو audio أو video أو font أو model أو application، ونوع فرعي يسمي الصيغة المحددة. image/png وapplication/json كلاهما نوع وسائط مكتمل؛ image وحده ليس كذلك.

تحمل الأنواع الفرعية اصطلاحات خاصة بها. كانت x- البادئة تعلّم نوعًا تجريبيًا، كما في application/x-tar، ورغم إهمال هذه الممارسة فإن الأسماء الباقية منتشرة جدًا بحيث لا يمكن تغييرها. أما اللاحقة +suffix فتقول إن الصيغة مبنية على بناء جملة أعم: image/svg+xml هي XML، وapplication/ld+json هي JSON، ويمكن للمحلل التراجع إلى البناء الأساسي عندما لا يتعرف على الصيغة المحددة.

بعض الأنواع تقبل وسائط بعد فاصلة منقوطة. الأهم هو charset، كما في text/html; charset=utf-8. حذفه في استجابة نصية يدعو المتصفح إلى تخمين الترميز، وهو مصدر كلاسيكي للنص المشوه، لذا فالتصريح بـ UTF-8 صراحةً يستحق دائمًا الأحرف الإضافية.

لماذا الرأس أهم من الامتداد

تقرر المتصفحات ما تفعله باستجابة بناءً على رأس Content-Type، لا على اسم الملف في الرابط. خدمة PNG بصيغة text/plain تعرض جدارًا من القمامة الثنائية؛ وخدمة JSON بصيغة text/html قد تجعل عميل الجلب يرفضها. ضبط الرأس الصحيح هو ما يجعل التنزيل يفتح في التطبيق الصحيح ويعرض موردًا مضمّنًا بدلًا من تنزيله.

ولعدم التطابق عواقب أمنية أيضًا. مارست المتصفحات الأقدم شمّ MIME، فتدقق في البايتات الأولى للاستجابة وتتجاوز رأسًا اعتبرته خاطئًا. المهاجم القادر على رفع ملف يبدو كـ HTML قد يجعله يُنفَّذ في نطاق الموقع حتى عندما يعلّمه الخادم كصورة. رأس X-Content-Type-Options: nosniff يعطل ذلك السلوك وهو الآن ممارسة قياسية على أي نقطة نهاية تخدم محتوى رفعه المستخدمون.

للتنزيلات، اقرن نوع الوسائط بـ Content-Disposition: attachment; filename="report.pdf". يصف نوع الوسائط ما هي البايتات، ويصف التصرف ما يفترض أن يفعله المتصفح بها، والاثنان يجيبان عن سؤالين مختلفين.

أين يعيش التعيين فعلًا

لا يوجد جدول موحد وحيد من الامتداد إلى النوع، وهو ما يفاجئ الناس. تسجّل IANA أنواع الوسائط نفسها، لكن تعيين الامتداد إلى النوع اصطلاح محلي يديره كل خادم. يقرأ Apache ملف mime.types، وللنجنكس ملف mime.types خاص به، وتشحن أطر التطبيقات جداول بحث خاصة بها. لهذا قد يُقدَّم ملف .wasm نفسه بشكل صحيح بواسطة خادم واحد وبصيغة application/octet-stream بواسطة آخر لم يُحدَّث.

application/octet-stream هو الاحتياط العام الذي يعني "بيانات ثنائية اعتباطية". إنه الجواب الصادق عندما تكون الصيغة مجهولة حقًا، لكنه يهزم العرض المضمّن، لذا يستحق إضافة تعيين صريح لأي صيغة يخدمها موقعك بانتظام. الصيغ الأحدث مثل AVIF وJXL وWebAssembly هي الأكثر غيابًا غالبًا من إعدادات الخوادم الأقدم.

ملاحظة مفتوحة المصدر: منفذ بلغة جافا سكريبت فانيلا دون أي مكتبات خارجية.

الأسئلة الشائعة

لماذا ملفي يُنزَّل بدلًا من عرضه؟
إما أن نوع الوسائط هو `application/octet-stream` أو أن الاستجابة تحمل `Content-Disposition: attachment`. اضبط النوع الصحيح وأزل تصرف المرفقات للعرض المضمّن.
ما نوع MIME لـ JSON؟
`application/json`. استخدمت أكواد أقدم أحيانًا `text/json` أو `application/x-json`، لكن لا شيء منهما مسجّل وبعض العملاء يرفضونهما.
هل يجب أن تكون جافا سكريبت text/javascript أم application/javascript؟
`text/javascript` هي الصيغة الموصى بها حاليًا. كلاهما يعمل في كل متصفح، لكن مواصفة HTML استقرت على نسخة النص وتدرج صيغة التطبيق كمهجورة.
هل أحتاج تضمين charset؟
للأنواع النصية، نعم. بدونه يخمّن المتصفح، ما ينتج نصًا مشوهًا للمحتوى غير ASCII. أرسل `text/html; charset=utf-8` أو المكافئ لنوعك.
ماذا تعني اللاحقة +xml أو +json؟
أن الصيغة مبنية على بناء جملة أعم. عميل لا يعرف `application/ld+json` تحديدًا ما زال يستطيع تحليلها كـ JSON، ما يجعل الأدوات العامة ممكنة.
لماذا يرسل خادمي النوع الخاطئ لـ .webp أو .avif؟
الامتداد مفقود من ملف `mime.types` لذلك الخادم. أضف تعيينًا صريحًا في إعداد الخادم؛ الملف نفسه سليم ولا يحتاج تغييرًا.