ブラウザのリクエストに応じて、予め圧縮しておいたのか生のか選んでjsやcssを配信する方法 〜Apache 2.2編〜

ググるといろいろできますけど、若干おハマりしたので。

こんな設定で:

# Expires*は圧縮には関係ないけど
ExpiresActive On
ExpiresByType application/javascript  "access plus  1 years"
ExpiresByType text/css                "access plus  1 years"

# こっちが本丸
<Location ~ "\.(js|css)(\.(js|css|gz))?$">
  Options     +MultiViews
  RemoveType  .gz
  AddEncoding x-gzip .gz
</Location>


こんなファイルを置いておくと:

$ ls -1 js/
jj.js.gz
jj.js.js


こんな感じのレスポンスになります。

$ curl -i -H 'Accept-Encoding: gzip'  http://goa/js/jj.js?801|egrep -a ^Content
Content-Location: jj.js.gz
Content-Length: 36
Content-Type: application/javascript
Content-Encoding: gzip
  ↑圧縮されたデータが返ってきてる

$ curl -i -H 'Accept-Encoding: curry' http://goa/js/jj.js?801|egrep -a ^Content
Content-Location: jj.js.js
Content-Length: 11
Content-Type: application/javascript
  ↑こっちは生データ


今回のおはまりポイント:

  • うっかり「AddType application/x-gzip .gz」とかしてると、レスポンスのContent-Typeがapplication/x-gzipになっちゃう。なので RemoveType してる。
  • /js/jj.js のようにURLに拡張子を入れたかったら、生の方のファイル名は jj.js じゃなくて jj.js.js にしないといけない。cssだったら foo.css.css に。
  • MultiviewsMatchとかrewriteとかは使わないでもできた