Posted at

画像の拡張子やContent-Typeが違ってもブラウザには表示されるのか

結論: 実際のフォーマットと拡張子やContent-Typeが違っていても表示はされます。


フォーマットと拡張子とContent-Type

例えばPNG画像は、ファイルの拡張子.pngで保存して、Content-Typeimage/pngで配信するものとされています。

これらが「ちぐはぐ」だったらブラウザはどう解釈するのか実験してみました。

経験的には実際のフォーマットに従ってちゃんと表示されますが、裏付けになる資料があるといいなと思って結果を共有します。

この辺の挙動はHTMLの勧告に記述がありそうな気もしますがサクッと見つけられず(詳しい方教えてください!)。


実験用のページ

こんなページを用意しました。

https://www.ideamans.com/_experimental/image-format-ext-content-type/

Image_Format___Extension___Content-Type_Test.png

JpegとPNGについて、実際の内部フォーマット、拡張子、Content-Typeヘッダのすべての組み合わせで画像を表示します。

正しい組み合わせの画像は背景色を緑、拡張子かContent-Typeあるいはその両方が内部フォーマットと異なる画像は背景色を赤としています。

これらの画像がすべて表示されれば、そのブラウザは実際の内部フォーマットに従って表示しているということになります。


検証

横着してBrowser Screenshotsを利用しました。

https://developer.microsoft.com/en-us/microsoft-edge/tools/screenshots/?url=https%3A%2F%2Fwww.ideamans.com%2F_experimental%2Fimage-format-ext-content-type%2F

すべて問題なく表示されていますね。

screencapture-developer-microsoft-en-us-microsoft-edge-tools-screenshots-2019-03-07-08_34_33.png

ついでにBrowsershotsでも。

http://browsershots.org/https://www.ideamans.com/_experimental/image-format-ext-content-type/

いくつか非対応なのか不具合なのかわからないブラウザもありますが、かなりドマイナーなのでよしとしましょう。


最後に

なぜこの実験をしたのかというと、WebPの配信はしばらくJpegやPNGのレスポンスを差し替える方法が主流になりそうだからです。

image.pngへのリクエストを内部的にWebPにルーティングして、Content-Type: image/webpとして返す、という方法ですね。

拡張子が.jpg.pngでもWebP画像を配信しちゃっても表示される裏付けが欲しかったのです。

もちろんバラバラでもいいという意図ではないので、拡張子やContent-Typeはお行儀良く指定しましょう!