← همه ابزارها

مرجع انواع MIME

انواع MIME چیست، فرمت type/subtype چطور کار می‌کند، Content-Type در HTTP و ایمیل کجا اهمیت دارد، انواع رایج و اینکه چرا نوع اشتباه همه چیز را خراب می‌کند.
پسوندنوع MIME

نوع MIME واقعاً چیست

نوع MIME، که به آن نوع رسانه هم می‌گویند، یک برچسب کوتاه است که به نرم‌افزار می‌گوید یک فایل یا بدنه پیام حاوی چه نوع داده‌ای است. در ایمیل به وجود آمد (نامش مخفف Multipurpose Internet Mail Extensions است) اما امروز همه جای وب دیده می‌شود. قالب آن همیشه type/subtype است: یک دسته‌بندی کلی، یک اسلش، و یک فرمت خاص. پس text/html یعنی «متن، به شکل HTML»، image/png یعنی «یک تصویر، به شکل PNG»، و application/json یعنی «داده اپلیکیشن، کدگذاری‌شده به صورت JSON».

نوع سطح بالا از یک مجموعه ثابت که توسط IANA، رجیستری رسمی، نگهداری می‌شود می‌آید: text، image، audio، video، application، font، model، multipart، و چند مورد جدیدتر مانند haptics. زیرنوع فرمت خاص است. فروشندگان می‌توانند موارد خود را با پیشوند vnd. اضافه کنند (برای مثال application/vnd.ms-excel)، و انواع آزمایشی به طور تاریخی از پیشوند x- استفاده می‌کردند، هرچند آن قرارداد اکنون منسوخ شده است.

آیکون‌های فایل درخشان انتزاعی که روی کاشی‌های دسته‌بندی‌شده با برچسب روی پس‌زمینه‌ای تیره به رنگ نیلی مرتب شده‌اند
هر فرمت فایل به یک برچسب type/subtype نگاشت می‌شود.

کجا انواع MIME اهمیت دارند

مهم‌ترین جایی که یک نوع MIME ظاهر می‌شود هدر پاسخ HTTP به نام Content-Type است. وقتی یک سرور یک صفحه، یک تصویر یا یک پیلود API ارسال می‌کند، این هدر به مرورگر می‌گوید که بایت‌ها را چگونه تفسیر کند. اگر هدر text/html بگوید، مرورگر مارک‌آپ را رندر می‌کند؛ اگر application/json بگوید، یک فراخوانی fetch() می‌تواند آن را تجزیه کند؛ اگر application/pdf بگوید، نمایش‌گر داخلی باز می‌شود. همان هدر در طرف درخواست هم وجود دارد: وقتی یک فرم یا بدنه API را POST می‌کنید، Content-Type به سرور می‌گوید که آنچه فرستادید را چگونه بخواند.

فراتر از HTTP، انواع MIME چند سیستم دیگر را هم هدایت می‌کنند. کلاینت‌های ایمیل از آن‌ها استفاده می‌کنند تا تصمیم بگیرند آیا یک پیوست تصویری برای پیش‌نمایش است یا یک فایل باینری برای ذخیره. کنترل‌کننده‌های آپلود فایل نوع اعلام‌شده را بررسی می‌کنند تا فایل‌ها را بپذیرند یا رد کنند. و سیستم عامل یا مرورگر از نوع، نه فقط پسوند فایل، برای انتخاب یک برنامه پیش‌فرض استفاده می‌کند. همین ایده پشت نحوه گزارش نتایج و خطاها توسط سرورها در کنار کدهای وضعیت HTTP قرار دارد — یک پاسخ 200 با نوع اشتباه می‌تواند به همان اندازه شکسته باشد که یک 404.

مواردی که هر روز استفاده خواهید کرد

یک مشت از انواع، اکثریت قریب به اتفاق ترافیک واقعی را پوشش می‌دهند:

  • text/html — صفحات وب (پسوند .html)
  • text/css — استایل‌شیت‌ها (.css)
  • text/javascript — نوع توصیه‌شده برای JavaScript (.js، .mjs)
  • application/json — تنها نوع رسمی JSON، تعریف‌شده در RFC 8259 (.json)
  • image/png، image/jpeg، image/webp، image/svg+xml — فرمت‌های تصویری رایج
  • application/pdf — اسناد PDF (.pdf)
  • application/octet-stream — نوع عمومی برای داده باینری ناشناخته یا دلخواه
  • text/plain — پیش‌فرض برای متن ساده که نوع غنی‌تری ندارد

JSON به یک توضیح نیاز دارد چون مردم را گیج می‌کند. تنها نوع صحیح application/json است. کدهای قدیمی گاهی از text/json، text/plain، یا application/x-javascript استفاده می‌کردند، اما اینها منسوخ شده‌اند و بعضی کلاینت‌ها از تجزیه آن‌ها خودداری می‌کنند. پارامتر charset هم برای JSON وجود ندارد — مشخصات UTF-8 را الزامی می‌کند، پس نوشتن application/json; charset=utf-8 زاید است هرچند بی‌ضرر. برای جدول کامل‌تری از فرمت‌ها و پسوندها، به جداول مرجع ما مراجعه کنید.

یک بسته داده درخشان که با یک نشان نوع انتزاعی برچسب خورده و از یک اتصال شبکه‌ای جاری است
Content-Type همراه با پیلود از طریق HTTP منتقل می‌شود.

چرا یک Content-Type اشتباه همه چیز را خراب می‌کند

مرورگرها و کلاینت‌ها به نوع اعلام‌شده اعتماد می‌کنند، پس اشتباه گرفتن آن پیامدهای ملموسی دارد. یک پاسخ API به صورت JSON با text/html ارائه دهید و مرورگر ممکن است سعی کند آن را رندر کند، یا یک کلاینت سخت‌گیر ممکن است یک خطای تجزیه قبل از اجرای کد شما ایجاد کند. یک فایل CSS یا JavaScript با نوع اشتباه ارائه دهید و یک ویژگی امنیتی به نام X-Content-Type-Options: nosniff باعث می‌شود مرورگر از اعمال آن خودداری کند، و به آرامی استایل‌بندی یا اسکریپت‌های صفحه شما را خراب می‌کند.

دانلودها نقطه شکست کلاسیک دیگری هستند. اگر می‌خواهید یک فایل دانلود شود نه نمایش داده شود، نوع در کنار هدر Content-Disposition اهمیت دارد. یک PDF ارسال‌شده به عنوان application/octet-stream به جای باز شدن در نمایش‌گر، به عنوان یک فایل عمومی دانلود می‌شود؛ یک تصویر ارسال‌شده به عنوان text/plain به صورت کاراکترهای بی‌معنی نشان داده می‌شود. در طرف آپلود، یک فایل با برچسب اشتباه می‌تواند از یک بررسی پسوند ساده‌انگارانه عبور کند، به همین دلیل است که اعتبارسنج‌های قوی بایت‌های واقعی (عدد جادویی) را بررسی می‌کنند نه به نوع ارائه‌شده توسط کلاینت اعتماد می‌کنند.

تاریخاً مرورگرها سعی می‌کردند نوع واقعی را حدس بزنند، یا «بو بکشند»، وقتی هدر اشتباه به نظر می‌رسید. آن رفتار حفره‌های امنیتی ایجاد کرد، پس بهترین روش مدرن این است که همیشه یک Content-Type دقیق ارسال کنید و بو کشیدن را با nosniff غیرفعال کنید. خلاصه کوتاه: نوع را در هر پاسخ به عمد تنظیم کنید، و بیشتر اشکالات رندرینگ، دانلود و تجزیه از بین می‌روند.

سوالات متداول

تفاوت بین نوع MIME و نوع رسانه چیست؟

آن‌ها یکی هستند. «نوع MIME» نام قدیمی‌تری است که از ایمیل می‌آید، در حالی که «نوع رسانه» اصطلاحی است که IANA و مشخصات مدرن HTTP ترجیح می‌دهند. هر دو به برچسب type/subtype اشاره دارند.

نوع MIME صحیح برای JSON چیست؟

application/json است که در RFC 8259 تعریف شده است. جایگزین‌های قدیمی مانند text/json یا application/x-javascript منسوخ شده‌اند و بعضی کلاینت‌ها آن‌ها را رد می‌کنند.

application/octet-stream به چه معناست؟

این نوع عمومی برای داده باینری دلخواه بدون برچسب خاص‌تر است. سرورها از آن به عنوان جایگزین برای انواع فایل ناشناخته استفاده می‌کنند که معمولاً یک دانلود را به جای نمایش در مرورگر فعال می‌کند.

چرا فایل CSS یا JavaScript من بارگذاری نمی‌شود؟

اغلب سرور آن را با Content-Type اشتباه ارسال می‌کند. با تنظیم X-Content-Type-Options روی nosniff، مرورگر از اعمال CSS که text/css نیست یا اسکریپت‌هایی که از نوع JavaScript نیستند خودداری می‌کند. پیکربندی سرور را اصلاح کنید تا نوع صحیح ارسال شود.

آیا می‌توانم charset به نوع MIME اضافه کنم؟

بله، برای فرمت‌های متنی، با استفاده از پارامتری مانند text/html; charset=utf-8. برای JSON غیرضروری است چون فرمت طبق مشخصات همیشه UTF-8 است، هرچند اضافه کردن آن ضرری ندارد.

آیا پسوند فایل نوع MIME را تعیین می‌کند؟

نه از طریق HTTP. سرور تصمیم می‌گیرد کدام Content-Type را ارسال کند، و مرورگر به آن هدر اعتماد می‌کند. پسوند فقط به عنوان یک راهنمایی برای ابزارها و سیستم‌های عامل عمل می‌کند وقتی هیچ نوع صریحی ارائه نشده باشد.