[Apache] mod_deflateでコンテンツをgzip圧縮して通信する 2
前回の続き。
proxyサーバを経由してアクセスしている場合に、mod_deflateでコンテンツを圧縮して通信していると問題になるのがproxyのキャッシュです。
アクセスによっては、gzip圧縮非対応のブラウザがgzipされたコンテンツを受け取ってしまうようなケースが出てきます。
対策として、サーバからのレスポンスにVaryというヘッダーを追加すると、このヘッダで設定した項目に従ってproxyへキャッシュさせるかどうかを指定させられます。
例えば、
Vary: Accept-Encoding
というヘッダを追加すると、リクエストヘッダにAccept-Encodingという名前のヘッダの値ごとにキャッシュをするようになります。
Accept-Encodingヘッダは、クライアントがサポートしている圧縮方法を表しています。もしサポートしていない場合はこのヘッダは見つかりません。よって、
Vary: Accept-Encoding
というヘッダがレスポンスにあれば、少なくともあgzip対応、非対応のクライアントで使用するキャッシュを分けることができます。こうすれば、gzip非対応のクライアントにgzipされたコンテンツが渡されることはなくなります。
ちなみに、上記のヘッダはApache2.xのmod_deflateではデフォルトで付加されるようです。
VaryヘッダにAccept-Encodingだけでなくその他のヘッダ(例えばUser-Agent)も加えたい場合には、以下のように
Header append Vary ヘッダ名
の記述をhttpd.confに加えます。また、新しくVaryヘッダを設定しなおす場合には
Header set Vary ヘッダ名
と記述します。
このような Header xxx の設定を行うには、以下のようにしてmod_headersモジュールを組み込みます。
% ./configure --enable-headers % make clean % make # su # make install
VaryヘッダにUser-Agentの項目を追加してしまうとproxyでのキャッシュの効率が落ちてしまうようなので、他の方法も考えて対策を練ったほうがよさそうです。