Cache-Control: no-transform で各種メディアの変換(再圧縮等)を防ぐ

まとめ

サーバ側のHTTPレスポンスヘッダに Cache-Control: no-transform を設定することで、プロキシ含む通信経路上でのメディアの変換を禁止できる。

概要

モバイル版Chromeにおける帯域圧縮時のEXIF欠損について、という記事でモバイル版Chromeの「データ使用量を節約」機能を利用している場合には画像のEXIF情報を利用するWebアプリの動作に支障があるという話を書きました。
自分の場合にはEXIFデータのOrientation(画像の回転方向)を利用したアプリにおいて、モバイル版Chromeのデータ使用量節約時に画像の回転方法がおかしくなる不具合がありました。

この件について、2014年11月に開催されたハイパフォーマンス ブラウザネットワーキング ミートアップにてGoogleのIlya Grigorikさんに直接質問できる機会があり聞いてみたところ、HTTPのレスポンスヘッダのキャッシュコントロール(Cache-Contorl: no-transform)を使うことでGoogleプロキシによる画像再圧縮を禁止できるので、それを使うのが良いだろうという回答を頂きました。

Web全体でみればEXIFを必要とする場面の方が少ないと思われるので、必要なときだけ配信するサーバ側でメディアの変換を禁止するほうが適切だなと納得しました。
自前のサーバで実際に設定して試してみたところ、確かにGoogleプロキシ経由でも画像が再圧縮されずに元のままのデータが転送されました。

Cache-Control: no-transform の設定について

ApacheおよびSinatraの場合を例に、Cache-Controlの設定方法の概要を説明します。

Apacheでの設定

まず、Apacheの設定ファイル(httpd.conf)にmod_headersモジュールがロードされているかを確認します。

次に、JPEG画像(*.jpg または *.jpeg)ファイルのみに Cache-control: no-transform を設定するとすれば、httpd.conf(または、.htaccessに)下記のように設定します。

Apacheから強制的にキャッシュを使わせないようにする方法
mod_headers – Apache HTTP サーバ バージョン 2.2 | Headerディレクティブ

Sinatraでの設定

Sinatraで画像や動画等の静的ファイルに Cache-control: no-transform を設定するにはControllerファイルに下記のように設定します。

Sinatra: README (Japanese) | キャッシュ制御(Cache Control)

Googleプロキシでの再圧縮後も一部EXIFデータは付加されていた

今回の記事を書くにあたり、あらためてGoogleプロキシのデータ圧縮について確認したところ、画像が再圧縮された場合にも実はEXIFデータが一部残っていることが分かりました。

Googleプロキシで再圧縮された後のjpeg画像に付加されていたEXIFデータは以下のとおりです。
– Orientation(画像の回転方向)
– ColorSpace(色空間)
– PixelXDimension(横ピクセル数)
– PixelYDimension(縦ピクセル数)

EXIFデータはあるものの、Orientation(画像の回転方向)は元の値によらず”1″(回転なし)の値になっており、さらに、ColorSpace(色空間)についても元の値によらず”1″(sRGB)となっているようです。
AdobeRGBの色空間の画像が再圧縮された場合にはEXIF情報のColorSpaceはsRGBに書き換わってしまうものの、画像のデータ自体の色空間は変換されずAdobeRGBのままになっているため、ブラウザで表示した際の色味が変わってしまいます。
つまり、画像の回転方向が必要な場合だけでなく、色空間を考慮した処理をする場合においても Cache-Control: no-transform を設定するべきであることが分かります。

Googleプロキシ以外の挙動について

Googleプロキシについては Cache-Control: no-transform の指定に従ってメディアを再変換せずにクライアントに配信するようですが、その他のプロキシについては未調査です。
例えば、Softbankやauのキャリア回線については通信の最適化として画像や動画を再圧縮する場合があると説明されていますが、no-transformの指定をした際にどうなるのかは不明です。

参考

モバイル版Chromeにおける帯域圧縮時のEXIF欠損について
ハイパフォーマンス ブラウザネットワーキング ミートアップ
Apacheから強制的にキャッシュを使わせないようにする方法
mod_headers – Apache HTTP サーバ バージョン 2.2 | Headerディレクティブ
Sinatra: README (Japanese) | キャッシュ制御(Cache Control)
HTTP/1.1: Header Field Definitions
ご利用の際に通信制御することがある内容について | 個人のお客さまへのお知らせ | お知らせ | モバイル | ソフトバンク
IS NETコース | 料金・割引:スマートフォン・携帯電話 | au

シェアする

  • このエントリーをはてなブックマークに追加

フォローする