Expiresヘッダを送出するPHPのクラスとmod_rewrite
レンタルサーバーではmod_expiresが使えない場合が多いので、PHPとmod_rewriteで頑張って追加してみよう的な感じです。
ただ、以下で示す方法は、画像などの静的ファイルにExpiresヘッダを追加するため、ファイル数分のPHPが動くのでサーバーに大きな負荷をかけてしまいます。
上記理由により、アクセスが多いサイトでは、使用しない方が無難かも知れません。
概要
header関数を利用して Expires / Last-Modified / Cache-control / Content-Type を送出するPHPのクラスと、それを利用するためのmod_rewriteの設定。
大まかな処理の流れ
- リクエストされたファイルが存在する場合、ファイルのフルパスをPHPに渡して処理。
- 拡張子からMIMEタイプを判別してContent-Typeを送出。
- デフォルトの設定ではGZIP圧縮してからファイルを出力。
ダウンロード
使い方
PHPの設定
適当なPHPファイルを作ってExpiresHeader.phpを読み込み、必要に応じてMIMEタイプの追加やコンフィグの書き換えを行う。
今回は eh.php と言うファイルを作成。
<?php
require '/path/to/ExpiresHeader.php';
try {
$eh = new ExpiresHeader();
// ファイルをセット
$eh->setFile($_GET['file']);
// コンフィグ
$eh->setConfig(array(
'days' => 7, // キャッシュは7日間有効 (初期値は30)
'gzip' => false // GZIP圧縮はしない (初期値はtrue)
));
// MIMEタイプ追加
$eh->setMimeType(array(
'html' => 'text/html',
'css' => 'text/css'
));
$eh->display();
} catch (Exception $e) {
header('HTTP', true, $e->getCode());
echo $e->getMessage();
exit(0);
}
/path/to/ExpiresHeader.php
の部分は適宜書き換え。
.htaccessの設定
RewriteEngine On
# Rewriteの基点
RewriteBase /
# 存在するファイルのみ有効
RewriteCond %{REQUEST_FILENAME} -f
# ヘッダを送出するファイルの拡張子
RewriteCond %{REQUEST_FILENAME} "\.(jpe?g|gif|png|ico|html?|xml|css|js|rdf|rss|xsl|swf|flv)$"
# PHPにファイルのフルパスを渡す
RewriteRule .+ /path/to/eh.php?file=%{REQUEST_FILENAME} [L]
/path/to/ExpiresHeader.php
の部分は適宜書き換え。
以上で設定は終り。
注意点として、セキュリティ上の理由から、PHPを直接呼び出す事は出来なくなっています。mod_rewriteが使えない環境では、導入を諦めて下さい。南無。
まとめ
- 適当なPHPファイルでExpiresHeader.phpを読み込む
- 必要に応じてコンフィグやMIMEタイプリストをいじる
- RewriteCondでヘッダを送出するファイルの拡張を設定
- サーバー負荷が高いのでアクセス数が多い場合は使わない方が無難