Apache2 : mod_rewrite の設定

ここでは、Debian に インストールした Apache2 で mod_rewriteを有効にする方法と、 mod_rewriteの使い方(設定)などを記録します。

mod_rewriteを有効にする

Debianでmod_rewriteを有効にするには、a2enmodを使用します。

# a2enmod rewrite
Module rewrite installed; run /etc/init.d/apache2 force-reload to enable.

.htaccessを有効にするため、AllowOverrideディレクティブをNoneからAllへ変更します。

「/etc/apache2/site-available/default」にあるDirectoryディレクティブに次のように設定します。
(指定のディレクトリ)

AllowOverride All

設定が終了したらApacheを再起動します。

# /etc/init.d/apache2 restart

mod_rewriteの設定

mod_rewriteの設定をCakePHPに付属する.htaccessで見てみます。

CakePHPでは、次のような設定がされています。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

最初の<IfModuleの部分は、mod_rewrite.c(mod_rewrite)が有効な場合処理を行うという意味になります。

RewriteEngineは、mod_rewriteの処理を有効・無効に設定します。offの場合、置き換え処理を行いません。

RewriteCondは、置き換え(RewriteRule)処理を行う条件を設定します。

最後にRewriteRuleは、実際の置き換えルールになります。マッチした部分が、$1の換わりに使用されます。

mod_rewriteの条件・オプション

RewriteCond

条件に指定できる変数名には、次のようなものがあります。

種類 変数名
HTTPヘッダ HTTP_USER_AGENT , HTTP_REFERER , HTTP_COOKIE , HTTP_FORWARDED , HTTP_HOST , HTTP_PROXY_CONNECTION , HTTP_ACCEPT
コネクション REMOTE_ADDR , REMOTE_HOST , REMOTE_USER , REMOTE_IDENT , REQUEST_METHOD , SCRIPT_FILENAME , PATH_INFO , QUERY_STRING AUTH_TYPE
サーバー環境変数 DOCUMENT_ROOT , SERVER_ADMIN , SERVER_NAME , SERVER_ADDR , SERVER_PORT , SERVER_PROTOCOL , SERVER_SOFTWARE
システム日付・時刻変数 TIME_YEAR , TIME_MON , TIME_DAY , TIME_HOUR , TIME_MIN , TIME_SEC , TIME_WDAY , TIME
その他 API_VERSION , THE_REQUEST , REQUEST_URI , REQUEST_FILENAME , IS_SUBREQ

条件に指定できるパターンに、次のようなものがあります。

パターン 概要
! 文字列の前につけることで、マッチしないパターンを指定
< 文字列比較
> 文字列比較
= 文字列比較
-d 指定したディレクトリが存在すればtrue
-f 指定したファイルが存在すればtrue
-s ファイルが存在し、有限のサイズを持っていればtrue
-F アクセス可能な有効なパスを指している場合にtrue(内部サブリクエストを用いてcheckされる)
-U アクセス可能な有効なURLとなっている場合にtrue(内部サブリクエストを用いてcheckされる)

RewriteCondに指定できるオプションに、次のようなものがあります。(デフォルトはANDになっています。)

オプション 機能
[NC] 大文字・小文字を区別をしない
[OR] 次に続くRewriteCondの判定条件をORで結ぶ

RewriteRule

RewriteRuleに指定できるオプションに、次のようなものがあります。(カンマで区切って複数指定できます。)

オプション 機能
[R] "302 Moved Temporaily"のレスポンスを返しクライアントをリダイレクトする
[L] 条件にマッチした場合そこで判定を終了する(以下に続くRewriteRuleを評価しない)
[NS] 一次的なURLリクエストの場合のみ条件を評価
(サーバー内部で発せられるサブリクエストの場合は判定をスキップする)
[QSA] クエリ文字列部分を追加します。
[N] 書き換えが済んだURLを新たなリクエストとして書き換え処理を再度最初のルールから繰り返す
[C] 次のRewriteRuleと条件を結合する
(置換禁止文字列"-"を用いて複数の条件をANDで複合適用する場合に用いる)
[F] マッチしたURLへのアクセスを禁止する
(クライアントには"403 Forbidden"のレスポンスが返される)
[P] PROXYモジュールを使用して他のサーバー(URL)にあるコンテンツを取得しその内容をクライントに返す

参考