Rewish

Expiresヘッダを送出するPHPのクラスとmod_rewrite

レンタルサーバーではmod_expiresが使えない場合が多いので、PHPとmod_rewriteで頑張って追加してみよう的な感じです。

ただ、以下で示す方法は、画像などの静的ファイルにExpiresヘッダを追加するため、ファイル数分のPHPが動くのでサーバーに大きな負荷をかけてしまいます。

上記理由により、アクセスが多いサイトでは、使用しない方が無難かも知れません。

概要

header関数を利用して Expires / Last-Modified / Cache-control / Content-Type を送出するPHPのクラスと、それを利用するためのmod_rewriteの設定。

大まかな処理の流れ

  1. リクエストされたファイルが存在する場合、ファイルのフルパスをPHPに渡して処理。
  2. 拡張子からMIMEタイプを判別してContent-Typeを送出。
  3. デフォルトの設定ではGZIP圧縮してからファイルを出力。

ダウンロード

ExpiresHeader.php

使い方

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でヘッダを送出するファイルの拡張を設定
  • サーバー負荷が高いのでアクセス数が多い場合は使わない方が無難