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)にあるコンテンツを取得しその内容をクライントに返す |