コンテンツの有効期限を遠い未来に設定し、クライアントのキャッシュを利用して HTTP リクエストを減らそうと言う提言。
Web サーバとして Apache を採用しているならば、mod_expires
を設定するのが、現実的だろう。
…が、さくらのレンタルサーバでは mod_expires は使用できない模様。
mod_expires の設定例
ちなみに mod_expires
が使用できるのならば .htaccess
に以下の設定をするだけでおっけ。
1 2 3 4 | <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 year" </IfModule> |
これで expires
ヘッダに1年後の日付をセットして返してくれる。
# 実際に設定する場合は ファイルタイプごとに有効期限を変えるなど、もっと細かく設定したほうがいいです。
php + mod_rewrite での代替案
で、mod_expires
が無い環境でどうやってこれを実現するか?
代替案として思いついたのが、mod_rewrite
を使って Expires
ヘッダを追加したいファイルが呼び出されたら、以下の php スクリプトをコールする方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php $file_found = false; // ファイルの存在確認 if (isset( $_GET [ 'file' ])) { $filename = str_replace ( 'http://' . $_SERVER [ 'SERVER_NAME' ]. '/' , '/' , $_GET [ 'file' ]); $filename = dirname( $_SERVER [ 'SCRIPT_FILENAME' ]). $filename ; $file_found = file_exists ( $filename ); } if ( $file_found ) { // ファイルが有った場合、Expires ヘッダ付きで出力 // Last-Modified ヘッダも送信 header( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' , filemtime ( $filename )). ' GMT' ); // コンテンツの有効期限は 365 日 $offset = 60 * 60 * 24 * 365; header( 'Expires: ' . gmdate ( 'D, d M Y H:i:s' , time() + $offset ). ' GMT' ); readfile( $filename ); } else { // ファイルが無かった場合 404 エラーを返す header( 'HTTP/1.1 404 Not Found' ); } ?> |
注意:
このコードにはセキュリティに対する脆弱性が存在しています。
# 生で打ち込むことによって、アクセス権を与えていないファイルにもアクセスできるようになる。
もし、使用する場合はその辺の対策を行ってから使用してください。
これに add-expires.php
とかって名前をつけてやって、ドキュメントルートに保存。
で、 .htaccess
にこんな風に書いておく。
1 2 3 4 5 6 | <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} "\.(jpe?g|gif|png|html?|xml|rdf|rss|xsl|css|js|3gp|asf|avi|mp4|mpg|mov|rm|swf|flv|wmv)" RewriteRule .+ /add-expires.php?file=%{REQUEST_URI} [L] </IfModule> |
こうすることで、jpeg,gif,png,html,xml,css,js,各種ビデオファイル
に Expires
ヘッダを付加してくれる。
ただ、ファイルが読み込まれるたびに php スクリプトが起動するので、サーバに掛かる負荷はバカにならない。
当サイトのような弱小サイトならまだしも、アクセス数の多いサイトにはオススメできない方法だ。
# 素直に mod_expires
を導入するか、管理者に導入してもらうように懇願しよう。
ピンバック: WordPressを高速化する9つのステップ | PLUS
ピンバック: ついに出た!Chrome版「Page Speed」の使い方 :: Stocker.jp / diary