本稿では、 Apache httpd のモジュール「mod_rewrite」の機能である RewriteCond ディレクティブについて解説します。
RewriteCond とは?
RewriteCond ディレクティブは、RewriteRule を実行するための条件を定義するための記述です。 RewriteCond に記述した条件が満たされた時のみ RewriteRule に記述したURLの書き換えと転送が実行されるようになります。
RewriteCond は、RewriteRule 記述の直前に複数記述することができます。 RewriteCond を複数記述した場合には、複数の条件が全て一致した場合に RewriteRule を適用するのか(AND)、複数の条件のいずれかが一致した場合に適用するのか(OR) も指定することができます。
RewriteCond ディレクティブの書式
RewriteCond ディレクティブの書式は、次の通りです。 それぞれの指定項目について、次で詳しく説明します。
RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]
RewriteRule ここにRewriteRuleのURL書換&転送設定を記述
フラグ
項目「フラグ」の役割は2つがあります。
- RewriteCond の適用条件 AND/OR を切替える
- 条件判定に大文字/小文字の区別をするか否かを切替える
1つ目の役割は、RewriteCond を複数指定した場合の AND/OR を切替えます。 フラグを記述せずに RewriteCond を複数行記述した場合は AND になります。 フラグに [OR] と記述した場合は OR になります。
2つ目の役割は、その行の RewriteCond の条件比較を大文字と小文字を区別するか否かを切替えます。 [NC] と記述することで大文字と小文字を区別しなくなります。 (=NCを指定しないと区別します)
OR と NC をどちらも指定したい場合には [OR,NC] とカンマで区切って指定します。
例 : 条件を一つ指定する場合
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
RewriteCond %変数名 条件 [NC]
RewriteRule URL書換&転送の記述
例 : 条件を複数指定する場合 (AND条件の例)
RewriteCond %変数名 条件
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
例 : 条件を複数指定する場合 (OR条件で、1つ目の条件は大文字/小文字を区別しない場合の例)
RewriteCond %変数名 条件 [OR,NC]
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
変数名
変数名には Apache httpd が用意している以下の変数が利用できます。 何を条件にしたいのかを考えて、利用する変数を選定してください。
グループ | 変数名 | 値・意味 |
---|---|---|
HTTP ヘッダ | HTTP_USER_AGENT | ユーザーエージェント |
HTTP_REFERER | 参照元URL | |
HTTP_COOKIE | クッキー情報 | |
HTTP_FORWARDED | プロキシ情報 | |
HTTP_HOST | サーバーのホスト名 | |
HTTP_PROXY_CONNECTION | プロキシを経由しているか否か | |
HTTP_ACCEPT | ブラウザの言語タイプ | |
コネクション & リクエスト | REMOTE_ADDR | リモートアドレス |
REMOTE_HOST | リモートホスト名 | |
REMOTE_USER | リモートユーザー名 (基本認証利用時) | |
REMOTE_IDENT | リモートユーザーのID | |
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 | 曜日 (0:日 ~ 6:土) | |
TIME | 年月日時分秒 (例:20130123123456) | |
特別なもの | API_VERSION | APIバージョン |
THE_REQUEST | リクエスト文字列 | |
REQUEST_URI | リクエストURI | |
REQUEST_FILENAME | リクエストされたファイル名 | |
IS_SUBREQ | サブリクエストか否か | |
HTTPS | HTTPSでのアクセスか否か |
下で記述しますが、それぞれの変数を利用したサンプルは別稿で説明したいと思います。
条件パターン
条件パターンには正規表現を記述します。 上記の変数に代入されている文字列と比較するための正規表現です。 変数と正規表現の条件がマッチした際に、記述した RewriteCond の条件が成立(true)し、RewriteRule が実行されます。
使い方のサンプル
ここまで RewriteCond について概要/仕様を説明をしてきました。 本連載では下記の記事で具体的な使い方とサンプルを説明しています。 是非、続けてそちらの記事もご覧頂ければ、より具体的な使い所がご理解頂けると思います。
おわりに
本稿では RewriteCond ディレクティブの概要について解説しました。 次回からは RewriteRule の実践的な解説を行っていきます。 そちらもぜひご覧ください。