ハイパフォーマンスWebサイト フロントエンドのパフォーマンスの重要性から続いています。

Webサイトの高速化 ルール3 Expiresヘッダーを追加しよう!

May 24, 2007

------------------------------------------------------------------------------

http://developer.yahoo.net/blog/archives/performance/より翻訳。

Steve Souders は Yahoo!の「Chief Performance Yahoo!」です。

これは彼の「パフォーマンス改善のベストプラクティス」を書いた一連のブログです。

------------------------------------------------------------------------------

Webページのデザインはますますリッチになっています。つまり、ページ中に使用されるJavascript、スタイルシート、画像、Flash等は数が増えているということです。サイトを始めて訪問するユーザは多くのhttpリクエストをする必要があります。

でもExpiresヘッダーを使えば、それらのコンポーネントをキャッシュさせて、不必要なhttpリクエストを避けることができます。Expiresヘッダーはよく画像をキャッシュさせるために使用されますが、Javascript、スタイルシート、Flashといったすべてのコンポーネントでも使用すべきです。

ブラウザやプロキシサーバにキャッシュさせることで、httpリクエストの数もサイズも減らして、より高速にページをロードできるようになります。Webサーバは、httpレスポンスのExpiresヘッダーによって、そのコンポーネントがいつまでキャッシュして良いか、クライアントに知らせることができます。

つまり、以下のExpiresヘッダーは、このコンポーネントは2010年の4月15日までは、キャッシュしていても古くなることはないと、ブラウザに知らせることが出来るのです。

Expires: Thu, 15 Apr 2010 20:00:00 GMT

もしwebサーバにApacheを使っているなら、ExiresDefaultディレクティブによって、当日からの相対的な日数によって期限を指定することができます。

以下のExiresDefaultディレクティブの例は、リクエスト時から10年間で期限を指定しています。

ExpiresDefault "access plus 10 years"

非常に遠い未来の期限をExpiresヘッダーに指定した場合、コンポーネントを実際に変更する必要があれば、コンポーネントのファイル名を変更しなければならないことを忘れないで下さい
Yahoo!では、コンポーネントのファイル名にバージョン番号を含める(例えばyahoo_2.0.6.js.のように)ことで、ビルドプロセスでこの作業を実施しています。

非常に遠い未来の期限をExpiresヘッダーに指定することは、訪問済みのユーザのページビューに影響する場合があるということです。

初回訪問のユーザやブラウザキャッシュをクリアして空になっているユーザのHTTPリクエスト数には影響はありません。パフォーマンス改善に対するインパクトは、ブラウザ上にキャッシュしているユーザがどれくらいかに影響されます。

我々がYahoo!でユーザのキャッシュの有無を測定したところ、75-85%程度でした。

非常に遠い未来の期限をExpiresヘッダーに指定してユーザのブラウザキャッシュを再利用することで、ユーザとの接続において、1byteも送信すること無しにページを表示することができようになります。

Steve Souders

---------------------------------------------------------------------
◆◆訳注◆◆
「HTTPリクエストの数を減らす」ためには、トータルとしてはこれが一番効果がでるはずだ。
ただし、ブログのようなユーザが画像をアップするサイトでは、画像ファイル名は連番等で使い捨てるように設計する必要がある。
画像の内容が更新されても、キャッシュしたままで良いように。逆に設計がまずいと画像が更新されないという単純なバグになってしまう。

ちなみにこんな感じ。

CODE:
  1. <location>
  2. SetOutputFilter DEFLATE
  3. BrowserMatch ^Mozilla/4 gzip-only-text/html
  4. BrowserMatch ^Mozilla/4\.0[678] no-gzip
  5. BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  6. SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|swf|ico)$ no-gzip dont-vary
  7. Header append Vary User-Agent env=!dont-vary
  8. </location>

---------------------------------------------------------------------
エントリ一覧

Webサイトの高速化 フロントエンドのパフォーマンスの重要性
Webサイトの高速化 ルール1 HTTPリクエストの数を減らそう!
Webサイトの高速化 ルール2 CDNを使おう!
Webサイトの高速化 ルール3 Expiresヘッダーを追加しよう!
Webサイトの高速化 ルール4 コンポーネントを圧縮しよう!
Webサイトの高速化 ルール5 CSSは上に!
Webサイトの高速化 ルール6 scriptは下に!
Webサイトの高速化 ルール7 CSSのExpression()は使わない!
Webサイトの高速化 ルール8 JavaScriptとCSSは外部ファイルに!
Webサイトの高速化 ルール9 DNS Lookupsを減らそう!
Webサイトの高速化 ルール10 コードのサイズを圧縮する!
Webサイトの高速化 ルール11 リダイレクトを避けよう!
Webサイトの高速化 ルール12 スクリプトの重複に気をつける!
Webサイトの高速化 ルール13 ETagを正しく設定する!