mod_deflateを利用したままキャッシュを有効にするにはヘッダを書き換える必要がある様なのだが、
今回困っている箇所は静的ファイルの数も限られるんで、静的なgzipファイルを用意してmod_negotiationで配信しちゃおう!
と思ったのだが、
まず、mod_negotiationの使い方がよくわからなかったが、
Options MultiViews
で有効になる。
そして、要求されたファイルが存在しない場合に、要求ファイル名の後ろに.gzとか拡張子がついているファイルを探して適切なものを利用してくれる。
要求されたファイルが存在しない場合だけ有効になるので、今回は.jsをgzip化したかったので、
元のファイルを圧縮して .js.gz を作る。
元のファイルを .js.js にリネーム。
これでmod_negotiationによってどちらかが配信される。
元のファイルをリネームしないといけないのでなんか使いにくいな・・・
そして圧縮ファイルが配信されたのだが、
Content-Typeがx-gzipになってることに気づいた。
Content-Typeはapplication/javascriptでContent-Encodingがgzipでないとマズい・・・
考えたが、
<Files *.js.gz>
AddType application/javascript .gz
AddEncoding gzip .gz
</Files>
こんな感じで対象の2重拡張子ファイルを設定するしかなさそう。
この方法だとファイルに直接アクセスした場合にもContent-Typeが変わっちゃうが・・・
ちなみに、AddTypeだけでAddEncoding設定しないとmod_deflateされて壊れる。
こんなことするならmod_rewriteでやった方が良くね?思った。
ちなみにmod_rewriteで似たようなことするのは別のサイトでやったことある。
というわけでmod_rewriteでもやってみたが、
Options FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -f
RewriteRule .+ %{REQUEST_URI}.gz [L]
<Files *.js.gz>
AddType application/javascript .gz
AddEncoding gzip .gz
</Files>
こんな感じ。
gzip対応ブラウザか確認して、.gzを追加したファイルが存在すれば.gzを渡す。
AddTypeとAddEncodingはmod_rewriteの場合でも必要。
試行錯誤でググってる際に、
RewriteRuleの際にEオプションで変数を設定して
Header setで
Content-Typeを設定すればできるような情報を見つけたんだが、ダメだった。
mod_rewriteで変数が設定される前にmod_headersが処理されるぽい?変数が有効にならない。