MultiViewsでコンテントネゴシエーション

Options MultiViewsで設定。Webブラウザ(つかHTTP Request Header)に応じて、同一のURIに対して、異なる内容を応答する。

ブラウザに応じて、圧縮済み/非圧縮のコンテンツを返したり、言語ごとのコンテンツを返したり。

例えばアクセスの多い大規模サイトで、

場合は、圧縮済みのファイルを用意しておけばいいらしい。mod_deflateの場合は動的に圧縮するので、CPU負荷がかかるから?

実験

圧縮済みのファイルを返す

ref.

clientのAccept-Encodingヘッダの有無で。

最近でいうとprototype.jsが70KByteあるので、ブラウザがgzip圧縮に対応している場合に圧縮済みのprototype.js.gzを返したい、ということがあるらしい。

アクセスするURL: /index.html
用意するファイル:

  • /index.html.gz : gzip圧縮対応用
  • /index.html.html : gzip圧縮非対応用

非圧縮時は拡張子を2個重ねるのがポイント。index.htmlのファイルが存在していると、圧縮対応ブラウザで/index.htmlにアクセスした場合に、圧縮済みのindex.html.gzではなく、index.htmlそのものを返すっぽい。

おまけ: mod_rewriteで判定

ref.

apacheのMultiViewsを使わずにmod_rewriteのRewriteCondでAccept-Encoding headerや、fileを確認してやってるぽい。なるほどね。

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz

ForceType text/javascript
AddEncoding x-gzip .gz
言語によって応答するファイルを変更する

Accept-Languageヘッダ。
サーバでindex.html.jaとindex.html.enを用意する。で、AddLanguageで言語の設定をする。

AddLanguage ja .ja
AddLanguage en .en
$ curl http://localhost/index.html -H 'Accept-Language: ja'
$ curl http://localhost/index.html -H 'Accept-Language: en'