← Все инструменты

Справочник MIME-типов

Что такое MIME-типы, как устроен формат type/subtype, где важен Content-Type в HTTP и email, распространённые типы и почему неверный тип всё ломает.
РасширениеMIME-тип

Что такое MIME-тип

MIME-тип, он же медиатип, — это короткая метка, сообщающая программному обеспечению, какой вид данных содержит файл или тело сообщения. Появившись в электронной почте (название расшифровывается как Multipurpose Internet Mail Extensions — «многоцелевые расширения почты интернета»), сегодня он встречается повсюду в вебе. Формат всегда выглядит как тип/подтип: широкая категория, косая черта и конкретный формат. Таким образом, text/html означает «текст в форме HTML», image/png — «изображение в формате PNG», а application/json — «данные приложения, закодированные как JSON».

Верхний уровень type выбирается из фиксированного набора, поддерживаемого IANA (официальным реестром): text, image, audio, video, application, font, model, multipart и несколько более новых, например haptics. Подтип — это конкретный формат. Производители могут добавлять собственные типы с префиксом vnd. (например, application/vnd.ms-excel), а для экспериментальных типов исторически использовался префикс x-, хотя сейчас это не рекомендуется.

Абстрактные светящиеся иконки форматов файлов, рассортированные по категориям на тёмно-индиговом фоне
Каждый формат файла соответствует метке вида тип/подтип.

Где важны 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 ломает всё

Браузеры и клиенты доверяют указанному типу, поэтому ошибка имеет вполне конкретные последствия. Если ответ JSON API отдаётся с типом text/html, браузер попытается его отрендерить, или строгий клиент выдаст ошибку разбора ещё до того, как выполнится ваш код. Если CSS или JavaScript отдаётся с неправильным типом, функция безопасности X-Content-Type-Options: nosniff заставит браузер отказаться от их применения, молча нарушив стили или скрипты страницы.

Загрузки файлов — ещё одна классическая точка отказа. Если файл должен скачиваться, а не отображаться, тип важен так же, как заголовок Content-Disposition. PDF, отданный как application/octet-stream, скачается как безликий файл, а не откроется в просмотрщике; изображение с типом text/plain отобразится набором бессмысленных символов. На стороне загрузки неправильно подписанный файл может обойти наивную проверку расширения, поэтому надёжные валидаторы проверяют реальные байты («магическое число»), а не доверяют типу, указанному клиентом.

Исторически браузеры пытались угадать, или «сниффировать», реальный тип, когда заголовок выглядел неверно. Это поведение порождало уязвимости, поэтому современная лучшая практика — всегда отправлять точный Content-Type и отключать сниффинг через nosniff. Коротко: ставьте тип осознанно на каждый ответ — и большинство проблем с рендерингом, скачиванием и разбором исчезнут.

Часто задаваемые вопросы

В чём разница между MIME-типом и медиатипом?

Это одно и то же. «MIME-тип» — старое название из эпохи электронной почты, а «медиатип» — термин, который предпочитают IANA и современные HTTP-спецификации. Оба обозначают метку вида тип/подтип.

Какой правильный 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 отправить, и браузер доверяет этому заголовку. Расширение лишь подсказывает инструментам и операционным системам, когда явный тип не указан.