こんにちは。ritです。
今回の記事は前回の「PHPでファイルをダウンロードさせるダウンローダーの実装」記事の補足説明的な記事となりますので、ダウンローダーの実装についてはそちらの記事をご覧ください。
Content-Typeとは
Content-Typeはファイルの種別を示すためのヘッダーで、ダウンローダーの実装においてはダウンロードさせたいファイルの種類(テキストか、画像か、音声か、圧縮ファイルかなど)を、アクセス者に通知するためのものです。大半の場合、ファイルの拡張子に対応したものがあります。
記述にはMIMEタイプを使用します。
ダウンロードさせる機能の実装には、このContent-Typeにダウンロードさせるファイルの種類をMIMEタイプの記述で指定するのが基本となります。
初期状態ではブラウザ側がコンテンツの種類を勝手に判断し、ここで設定した値を無視することがあります。
X-Content-Type-Optionsをnosniffに設定することで、この挙動を防いで設定した値に従わせることが出来るようになります。
インターネットでダウンローダーの作成について検索すると、Content-Typeによく設定される値にapplication/force-downloadやapplication/octet-streamなどを見かけることがあると思いますが、具体的にこれはどういう意味を持つのかをまず解説します。
application/force-downloadについて
application/force-downloadは、ダウンローダーを作成する際に慣習的に用いられてきたものですが、このようなMIMEタイプは存在せず、アクセス者に通知するファイルの種類は「不明」となります。application/force-downloadという文字列自体には、処理上何の意味もありません。
Internet Explorerが主流であった時代に、Content-Typeに不明なMIMEタイプを設定するとダウンロードさせる仕様を利用して、簡単にダウンロードを実装させるためによく使われてきた結果、現代まで残ってきたものです。
現代では誤動作防止やセキュリティ上の観点から、このような情報は正確なものを明らかにしておくことが基本となっていますので、不明なMIMEタイプを設定することは推奨されない記述となります。
今更仕様変更すると影響が出る部分が多いので今も残っている仕様だと思われますが、近い将来無効化される可能性も十分にあると思いますので、やめておきましょう。
application/octet-streamについて
application/octet-streamは、任意のバイナリデータを表すMIMEタイプです。こちらはきちんと存在して意味を持ちます。
ただし、ファイルの種類が具体的に何かまで正しく通知するものではなく、ざっくり言えば「何かわからないけどとりあえずバイナリデータだから直接表示せずにダウンロードしてね」というような意味になります。
ほとんどの場合これで問題なくダウンロードさせることは可能で、タイプに「その他」という枠を残しておかなければならない以上、このMIMEタイプが今後無効化されることも無いと思いますので、困ったらこれを設定しておけば大丈夫です。
ですが、前述の通り種類がわかっているならば正確なものを指定するほうがより安心できるので、ダウンローダーを実装する状況においては、ファイルの種類を明確に特定できるMIMEタイプを指定するほうが良いです。
じゃあどうすればいいか
ダウンローダーを実装する人間は、ダウンロードさせたいファイルの種類は分かっているはずなので、正しいMIMEタイプを設定するようにしましょう。一例を挙げるとimage/pngやapplication/zipのようなものです。
ただし、ファイルの種類によってはそのままではダウンロードする挙動とならないので、Content-Disposition: attachmentと組み合わせて使うようにして下さい。
(詳しくは実装記事)
よく使われるMIMEタイプについてはこちらのページが分かりやすいです。
よくある MIME タイプ – HTTP | MDN
※補足 そもそもMIMEタイプとは何か
MIME(Multipurpose Internet Mail Extensions)は、元々電子メールで使用されていたファイルの種別を示す情報で、サーバとブラウザ等がデータのやり取りをする際に、拡張子と同じようにファイルの種別を判別するために使用されてきた標準の形式です。
IANA(Internet Assigned Numbers Authority)が公式の型を管理しており、こちらに登録されたものが標準として扱われます。
一般的なものは滅多なことがない限り変更はないと思いますが、ものによっては他と統一されたり名前が変わったり無くなったりする場合もあるようなので、一応注意。