متوفر أيضًا بلغات أخرى: English · Español · Português · Français
أنواع MIME
أنواع الوسائط التي يمكن أن تُرسل إليك فعلًا، مع تمييز المسجَّل منها والحكم في مواضع الخلاف.
ما نوع MIME؟
نوعُ MIME — وقد صار المعيار يسمّيه نوع الوسائط — هو اللافتة التي يلصقها الخادم بالملف ليعرف المتصفح ما هو. يسافر في ترويسة Content-Type، وصورته text/html أو image/png، وهو الذي يقرّر أيرسم متصفحُك صفحةً أم يعرض صورةً أم يعرض عليك تنزيلًا. وإذا أخطأ وصل ملفٌ سليمٌ تمامًا رطانةً أو تنزيلًا غير متوقَّع.
والقائمة ذات الحجية هي سجل أنواع الوسائط لدى IANA، وفيه 2,318 نوعًا موزّعةً على تسع شجرات من المستوى الأول. وهذه الصفحة مبنيّةٌ من ذلك السجل، ومن ملف mime.types في Apache httpd، ومن نظيره في nginx، والثلاثة منزَّلة لا مستذكَرة.
وهي عمدًا ليست تفريغًا للسجل، لسببٍ يحسن معرفته قبل أن تقصده بنفسك.
كيف تستعمل هذه القائمة؟
- ابحث بالامتداد أو بالنوع. فالامتداد يُطابَق مطابقةً تامة بالنقطة أو بدونها، فـwebp و.webp سواء. وما عدا ذلك يُبحَث داخل النوع: فـimage/ تعطيك شجرة الصور، و+xml تعطيك الأنواع ذات اللاحقة البنيوية.
- انظر إلى الوسم قبل أن تطمئن إلى نوع. فـ«مسجَّل» يعني أنه في سجل IANA، والمرجع بجانبه هو الـRFC أو الجهة التي أدرجته. وما عداها أنواعٌ يرسلها إليك خادم الوِب غير مكترث ولم يرها سجلٌّ قط.
- اقرأ جدول الخلاف إن كان ملفك من الملفات المشكِلة. فثلاثة عشر امتدادًا تتلقى جوابين مختلفين من Apache وnginx، والجدول يبيّن لأي الطرفين ينحاز السجل في كل حالة.
السجل لا يستطيع الإجابة عن السؤال الذي جئت به
يكاد كل من يقصد قائمةَ أنواع MIME يحمل السؤال نفسه: أي Content-Type أُرسل لملف .webp؟ وسجل IANA لا يستطيع إخبارك. فأعمدته: الاسم والقالب والمرجع، وليس فيه عمودٌ للامتدادات البتة، لأن أيَّ امتدادٍ يقابل أيَّ نوع ليس مما تسجّله IANA. تستطيع أن تبحث عن image/webp فتتأكد أنه موجود، ولا تستطيع أن تبحث عن .webp.
ولا شيء آخر يسدّ الثغرة. فمعيار MIME Sniffing لدى WHATWG، وهو ما تنفّذه المتصفحات فعلًا، يقول صراحةً إن الامتدادات لا تُستعمل لتحديد نوع مورد يُجلب عبر HTTP لأنها غير موثوقة ويسهل تزويرها، وهو لا ينشر جدول امتداداتٍ خاصًّا به. فالربط ببساطة غير مقنَّن في أي مكان.
والذي يحسم عمليًّا هو خادم الوِب القائم أمام ملفاتك. ولهذا تستعمل هذه القائمة قاعدةً معلنة بدل انتقاءٍ يدوي: فهي تضم كل نوع وسائط يربط به Apache httpd أو nginx امتدادًا واحدًا على الأقل، وعددها 790، وهي المجموعة التي يمكن أن تُرسل إليك فعلًا. وإجمالي السجل مطبوعٌ إلى جوارها كي لا يحسب أحدٌ الجزء كلًّا.
خادمان، و91 امتدادًا مشتركًا، و13 خلافًا
يربط Apache بـ998 امتدادًا، وnginx بـ110. وواحدٌ وتسعون منها يرد عند كليهما، وفي ثلاثة عشر منها — أي 14.3% — يعطي كلٌّ جوابًا مختلفًا. وليست صيغًا نادرة: فمنها .js و.xml، وهما من أكثر أنواع الملفات إرسالًا على الوِب.
ومجرد عدّ الخلافات لا قيمة له، فكل خلافٍ في هذه الصفحة محكومٌ فيه بالرجوع إلى السجل. ثلاثةٌ يكسبها Apache بلا جدال: ففي .bmp و.m4a و.pdb يعطي Apache نوعًا مسجَّلًا ويعطي nginx نوعًا غير مسجَّل. وستةٌ هي رجوع nginx إلى application/octet-stream، وهو مسجَّل وصحيحٌ تقنيًّا ولا يقول للمتصفح شيئًا، وهو ما يجعل .exe و.iso و.deb تُنزَّل بدل أن تسيء التصرف. وفي اثنين لا نوع مسجَّل لدى أيٍّ من الطرفين.
والاثنان الباقيان هما الطريفان، وهما كذلك في اتجاهين متعاكسين. ففي .xml كلٌّ من application/xml وtext/xml مسجَّل، وRFC 7303 يسجّلهما قصدًا: فلا خادم مخطئ ولا جوابَ يُبحث عنه. وفي .js كلاهما مسجَّل أيضًا، لكن مدخل application/javascript يستشهد بـRFC 9239، وهو المستند الذي جعل text/javascript الصيغة المعيارية وأبقى غيرها متقادمًا. فـApache مواكب، وnginx متأخر. العَرَض واحدٌ في الظاهر، والتفسير مختلفٌ كل الاختلاف، ولا يميّز بينهما إلا قراءة المراجع.
ثلثُ ما يمكن أن يُرسل إليك ليس في السجل
من بين 790 نوع وسائط يربطها هذان الخادمان بامتدادات، 547 في سجل IANA و243 ليست فيه. وذلك قرابةُ ثلثِ كل ما يسلّمه تثبيتٌ افتراضي إلى متصفح، بترويسة Content-Type لم تسجّلها أي جهة تقييس قط. وأكثرها بقايا بادئة x- لصيغٍ لم تُسجَّل قط، وهي تعمل عمليًّا لأن لا أحد يتحقق.
وسبعةٌ منها تمضي أبعد فتستعمل شجرةً من المستوى الأول لا وجود لها. فـIANA تسجّل تسعًا — application وaudio وfont وimage وmessage وmodel وmultipart وtext وvideo — وApache يشحن ستة أنواع chemical/* لصيغ ملفات جزيئية، وواحدًا تحت x-conference. فخادم وِبٍ حديثُ التثبيت سيرسل إليك Content-Type ليس مكوّنه الأول شجرةً مسجَّلة أصلًا.
وليس في هذا فضيحة، بل هكذا ينتهي عرفٌ عمره ثلاثون سنة بلا آلية إلزام. لكن يحسن علمه قبل أن تفترض أن نوعًا وردَ في ملف إعدادات هو نوعٌ معياري.
حدودٌ صادقة
هذه لقطةٌ لثلاث وثائق متحركة، وتاريخُ بنائها مطبوعٌ في الأسفل. فالسجل يكسب مداخل بانتظام، والخادمان يحدّثان ربطهما؛ والسكربت الذي يجمع ذلك كله في المستودع، فتستطيع الصفحة أن تقول متى كانت صحيحة.
وخادمان ليسا كل الخوادم. فـIIS وCaddy وأطر Node وشبكات التوصيل والمكتبة القياسية لكل لغة، لكلٍّ جدوله، ولن توافق هذين في كل حالة أيضًا. واختير Apache وnginx لأنهما يخدمان أكبر قدر من الوِب، لا لأنهما الرأيان الوحيدان.
والحدُّ الأعمق هو ما يحذّر منه معيار الاستشمام: فالنوع الذي يعلنه الخادم ليس دليلًا على ما يحويه الملف. فبإمكان أي أحدٍ رفعُ ملفٍ اسمه photo.png مملوءٍ بـHTML، ولهذا بعينه تستشمّ المتصفحاتُ المحتوى، ولهذا لا يجوز أن تبني قرارًا أمنيًّا على ترويسة Content-Type.
لماذا هي مجانية؟
لأنها قائمةٌ من حقائق عامة جُمعت من ثلاثة مصادر عامة. فالصفحة نصٌّ ساكن مع صندوق بحثٍ يرشّحها داخل متصفحك: لا يُرفع شيء ولا يُخزَّن شيء، وليس ثمة خادم في قراءتها.
فلا حساب ولا تسجيل ولا شيء محجوب. فالسجل وثيقةٌ عامة، وملفّا mime.types مفتوحا المصدر، والسكربت الذي يحوّلهما إلى هذه الصفحة في المستودع إلى جوارها.