WEBサイトの製作、管理、とかの日記ブログです。

<<   2018年06月   >>
SunMonTueWedThuFriSat
     12
3456789
10111213141516
17181920212223
24252627282930
新着記事
カテゴリ
過去ログ
コメント
検索
mod_deflateでキャッシュが無効化されてた
静的ファイルが304にならずに常に200になってることに気づいた。
どうもApache2.4のmod_deflateが悪さしている模様・・・

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が処理されるぽい?変数が有効にならない。

この記事へのコメント
名前:
URL
コメント:
この記事へのトラックバック :
whblog 1.7