MIME タイプはクライアントに対して、転送するドキュメントの種類を伝える機能です。ウェブにおいて、ファイル名の拡張子は意味を持ちません。従って、サーバーはそれぞれのドキュメントと共に正しい MIME タイプを転送するよう適切に設定することが重要です。ブラウザーはたいてい MIME タイプを、読み込んだリソースに対して行う既定のアクションを決めるために使用します。
さまざまな種類のドキュメントがありますので、MIME タイプも多数あります。この記事では、ウェブ開発でもっとも重要な MIME タイプを挙げますが、MIME タイプの完全な一覧 の記事で、ドキュメントの種類にあてはまる MIME タイプを探すことができます。
MIME タイプは、ドキュメントの種類の情報を伝える唯一の方法ではありません:
- 特に Microsoft のWindows システムでは、ファイル名の拡張子を使用することがあります。拡張子に意味があるとは考えないオペレーティングシステムもあります (特に Linux や Mac OS)。また外部の MIME タイプと同様に、それらが正しいという保証はありません。
- マジックナンバー。さまざまな種類のファイルの構文で、その構造を見ることで種類を特定できるようになっています。例えば GIF ファイルは 16 進数の値 47 49 46 38 [GIF89]、PNG ファイルは 89 50 4E 47 [.PNG] で始まります。マジックナンバーを持たない種類のファイルもありますので、100% 信頼できるシステムではありません。
ウェブでは MIME タイプが唯一適切なものですので、注意深く設定しなければなりません。ブラウザーやサーバーは MIME タイプを定義する、整合性を確認する、あるいは汎用的なタイプしか提供されない場合に正しい MIME タイプを検出するために、拡張子やマジックナンバーを基にした検出法を使用することがよくあります。
構文
一般的な構造
type/subtype
MIME タイプの構造はとてもシンプルです。タイプとサブタイプの 2 種類の文字列で構成されており、それらは '/'
で区切ります。空白は許可されていません。タイプ はカテゴリーを表しており、ディスクリートタイプやマルチパートタイプを使用できます。サブタイプは、それぞれのタイプを特定します。
MIME は大文字・小文字を区別しませんが、伝統的にすべて小文字で記述します。
ディスクリートタイプ
text/plain text/html image/jpeg image/png audio/mpeg audio/ogg audio/* video/mp4 application/octet-stream …
ディスクリートタイプはドキュメントのカテゴリーを示しており、以下のいずれかを使用できます:
タイプ | 説明 | 代表的なサブタイプの例 |
---|---|---|
text |
テキストを含んでおり、理論上は人間が読めるドキュメントを表します。 | text/plain , text/html , text/css, text/javascript |
image |
なんらかの種類の画像を表します。動画は含まれませんが、アニメーションする画像 (アニメーション GIF など) は画像のタイプで表します。 | image/gif , image/png , image/jpeg , image/bmp , image/webp |
audio |
なんらかの種類の音声ファイルを表します。 | audio/midi , audio/mpeg, audio/webm, audio/ogg, audio/wav |
video |
なんらかの種類の動画ファイルを表します。 | video/webm , video/ogg |
application |
なんらかの種類のバイナリーデータを表します。 | application/octet-stream , application/pkcs12 , application/vnd.mspowerpoint , application/xhtml+xml , application/xml , application/pdf |
特定のサブタイプを持たないテキスト形式ドキュメントは、text/plain
を使用するべきです。同様に特定の、あるいは既知のサブタイプを持たないバイナリー形式ドキュメントは、application/octet-stream
を使用するべきです。
マルチパートタイプ
multipart/form-data multipart/byteranges
マルチパートタイプは別個の部品に分割されるドキュメント用のカテゴリーであり、さまざまな MIME タイプを伴うことがよくあります。これは複合ドキュメントを表します。HTML フォーム や POST
メソッドに関係して使用される multipart/form-data
、およびドキュメント全体のサブセットのみ送信するための 206
Partial Content
ステータスメッセージと合わせて使用される multipart/byteranges
を除いて、HTTP はマルチパートのドキュメントを特定の方法で扱いません。メッセージは単純にブラウザーへ送信されます (おそらくドキュメントをインラインで表示する方法がわからず、名前を付けて保存することを提案されるでしょう)。
ウェブ開発者向けの重要な MIME タイプ
application/octet-stream
これは、バイナリー形式ファイル用の既定の値です。実際は未知のバイナリー形式ファイルを表しており、通常ブラウザーは自動的に実行したり、実行すべきであるかを確認したりしません。これらは Content-Disposition
ヘッダーの値が attachment
であるかのように扱い、ファイルを '名前を付けて保存' することを提案します。
text/plain
これは、テキスト形式ファイルの既定の値です。実際は未知のテキスト形式ファイルを表しているとしても、ブラウザーはファイルを表示しようとします。
text/plain
は任意のテキスト形式データを表すものではありませんので注意してください。特定の種類のテキスト形式データを想定している場合は、おそらくそのとおりに判断されないでしょう。特に、CSS ファイルを宣言する <link>
要素から text/plain
形式のファイルをダウンロードすると、text/plain
で示されたファイルは正しい CSS ファイルであると認識されません。CSS の MIME タイプである text/css
を使用しなければなりません。
text/css
ウェブページで CSS として解釈されなければならない、あらゆる CSS ファイルは text/css
のファイルであることが必須です。たいていのサーバーは拡張子が .css
であるファイルを CSS ファイルであるとは認識せず、text/plain
または application/octet-stream
MIME タイプを送信します。この場合、ほとんどのブラウザで CSS ファイルとは認識されず、暗黙的に無視されます。正しいタイプで CSS ファイルを提供するため、特に注意を払わなければなりません。
text/html
すべての HTML コンテンツは、このタイプで提供するべきです。application/xml+html
など、XHTML 向けの新たな MIME タイプは、現在ではほぼ無用です (HTML5 がこれらの形式を統一しました)。
画像タイプ
少数の画像タイプだけが広く認識されるとともにウェブで問題が起きないと考えられており、ウェブページで使用できます:
MIME タイプ | 画像タイプ |
---|---|
image/gif |
GIF 画像 (可逆圧縮、PNG が取って代わった) |
image/jpeg |
JPEG 画像 |
image/png |
PNG 画像 |
image/svg+xml |
SVG 画像 (ベクター画像) |
WebP (image/webp
) をこの一覧に加えるかという議論がありますが、新しい画像タイプはコードベースの増大を招くことにより新たなセキュリティの問題が発生する可能性があるため、ブラウザーベンダーはそれを受け入れるかを用心します。
他の種類の画像もウェブドキュメントで見受けられるでしょう。例えば、多くのブラウザが favicon などのためのアイコン画像タイプをサポートしています。特に ICO 画像は、このような状況で image/x-icon
MIME タイプでサポートされています。
音声と動画のタイプ
画像と同様に、HTML は <audio>
や <video>
要素での使用をサポートする形式を定義しませんので、ウェブで使用できる形式のグループは比較的小さなものです。HTML5 の audio 要素と video 要素でサポートされているメディアフォーマット で、使用可能なコーデックやコンテナーを説明しています。
これらのファイルの MIME タイプはたいていコンテナー形式を表しており、ウェブでもっとも一般的なものは以下のとおりです:
MIME タイプ | 音声または動画のタイプ |
---|---|
audio/wave audio/wav audio/x-wav audio/x-pn-wav |
WAVE コンテナー形式の音声ファイル。PCM オーディオコーデック (WAVE コーデック "1") はたいていサポートされていますが、他のコーデックのサポートは (あるとしても) 限定的です。 |
audio/webm |
WebM コンテナー形式の音声ファイル。Vorbis や Opus がもっとも一般的な音声コーデックです。 |
video/webm |
WebM コンテナー形式の、おそらく音声も含む動画ファイル。VP8 や VP9 がもっとも一般的に使用される動画コーデック、また Vorbis や Opus がもっとも一般的な音声コーデックです。 |
audio/ogg |
OGG コンテナー形式の音声ファイル。Vorbis が、このコンテナーでもっとも一般的に使用される音声コーデックです。 |
video/ogg |
OGG コンテナー形式の、おそらく音声も含む動画ファイル。通常の動画コーデックは Theora、音声コーデックは Vorbis です。 |
application/ogg |
OGG コンテナー形式を使用する音声または動画のファイル。通常の動画コーデックは Theora、音声コーデックは Vorbis です。 |
multipart/form-data
multipart/form-data
タイプは、入力済みの HTML フォーム の内容をブラウザーからサーバーに送信するときに使用できます。正式なマルチパートのドキュメントのようにさまざまな部品で構成されており、境界 (二重ダッシュ '--'
で始まる文字列) によって区切られます。。それぞれの部品自体がエンティティであり、固有の HTTP ヘッダーとして Content-Disposition
やファイルアップロードのフィールド用に Content-Type
、さらにごく一般的なヘッダーを伴います (境界線を区切り文字として使用するため、Content-Length
は無視されます)。
Content-Type: multipart/form-data; boundary=aBoundaryString (マルチパートドキュメント全体に関連付けられる、他のヘッダー) --aBoundaryString Content-Disposition: form-data; name="myFile"; filename="img.jpg" Content-Type: image/jpeg (データ) --aBoundaryString Content-Disposition: form-data; name="myField" (データ) --aBoundaryString (サブパート) --aBoundaryString--
以下のフォームがあるとします:
<form action="https://localhost:8000/" method="post" enctype="multipart/form-data"> <input type="text" name="myTextField"> <input type="checkbox" name="myCheckBox">Check</input> <input type="file" name="myFile"> <button>Send the file</button> </form>
これは以下のメッセージを送信します:
POST / HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498 Content-Length: 465 -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myTextField" Test -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myCheckBox" on -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myFile"; filename="test.txt" Content-Type: text/plain Simple file. -----------------------------8721656041911415653955004498--
multipart/byteranges
multipart/byteranges
MIME タイプは、部分的なレスポンスをブラウザーへ返す状況で使用します。206
Partial Content
ステータスコードを送信するとき、この MIME タイプはドキュメントがいくつかの部品で構成されることを示しており、それぞれの要求された範囲のひとつになります。ほかのマルチパートのタイプと同様に、境界の文字列を定義するために Content-Type
で boundary
ディレクティブを使用します。それぞれのドキュメント部品はドキュメントの実際のタイプを表す Content-Type
ヘッダーと、提供する範囲を表す Content-Range
ヘッダーを持ちます。
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270
eta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270
-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--
正しい MIME タイプを設定することの重要性
多くのウェブサーバーは未知の種類のリソースについて、既定の application/octet-stream
MIME タイプを送ります。セキュリティ上の理由で、多くのブラウザーはこのようなリソースに既定のアクションを定義することを許可せず、リソースを使用するためにディスクへ保存することをユーザーに強制します。以下のファイルタイプで、誤ったサーバー設定がよく見られます:
-
RAR でエンコードされたファイル。この場合、エンコードされたファイルの実際の種類を設定できることが理想です。しかしこれはたいていの場合できません (サーバーがそれを知ることができず、またこれらのファイルは種類が異なる複数のファイルを含むためです)。この場合、サーバーは
application/x-rar-compressed
MIME タイプを送信するように設定します。そうしなければ、ユーザーがそれらのファイルに対して、既定の有用なアクションを定義できなくなるでしょう。 -
音声および動画のファイル。正しい MIME タイプを持つリソースだけが、
<video>
または<audio>
要素で認識および再生されます。音声および動画に対して正しい MIME タイプを使用するよう注意してください。 -
プロプライエタリーなファイルタイプ。プロプライエタリーなファイルタイプを提供するときは、特に注意が必要です。特別な操作ができなくなるため、
application/octet-stream
の使用は避けてください。ほとんどのブラウザーは、この汎用的な MIME タイプに既定の動作 ("Word で開く" など) を定義できません。
MIME スニッフィング
MIME タイプが欠落している、あるいは MIME タイプが誤って設定されているとクライアントが考えている場合に、ブラウザーは MIME スニッフィングを行います。これは、リソースを確認して正しい MIME タイプを推測します。それぞれのブラウザーはこれを異なる方法で、またさまざまな状況下で実行します。実行可能なコンテンツを表す MIME タイプやそうでない MIME タイプが存在するため、この方法にはセキュリティ上の懸念が多少あります。サーバーは Content-Type
と共に X-Content-Type-Options
を送信して、MIME スニッフィングを抑制できます。