Expiresヘッダを追加しよう!

コンテンツの有効期限を遠い未来に設定し、クライアントのキャッシュを利用して HTTP リクエストを減らそうと言う提言。
Web サーバとして Apache を採用しているならば、mod_expires を設定するのが、現実的だろう。

が、さくらのレンタルサーバでは mod_expires は使用できない模様。

mod_expires の設定例

ちなみに mod_expires が使用できるのならば .htaccess に以下の設定をするだけでおっけ。

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 year"
</IfModule>

これで expires ヘッダに1年後の日付をセットして返してくれる。
# 実際に設定する場合は ファイルタイプごとに有効期限を変えるなど、もっと細かく設定したほうがいいです。

php + mod_rewrite での代替案

で、mod_expires が無い環境でどうやってこれを実現するか?
代替案として思いついたのが、mod_rewrite を使って Expires ヘッダを追加したいファイルが呼び出されたら、以下の php スクリプトをコールする方法。

<?php
$file_found = false;

// ファイルの存在確認
if (isset($_GET&#91;'file'&#93;)) {
 $filename = str_replace('http://'.$_SERVER&#91;'SERVER_NAME'&#93;.'/','/',$_GET&#91;'file'&#93;);
 $filename = dirname($_SERVER&#91;'SCRIPT_FILENAME'&#93;).$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 にこんな風に書いておく。

<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 を導入するか、管理者に導入してもらうように懇願しよう。

Expiresヘッダを追加しよう!」への2件のフィードバック

  1. ピンバック: WordPressを高速化する9つのステップ | PLUS

  2. ピンバック: ついに出た!Chrome版「Page Speed」の使い方 :: Stocker.jp / diary

コメントを残す

メールアドレスが公開されることはありません。