Apache RewriteCond の基礎知識

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では、 Apache httpd のモジュール「mod_rewrite」の機能である RewriteCond ディレクティブについて解説します。

RewriteCond とは?

 RewriteCond ディレクティブは、RewriteRule を実行するための条件を定義するための記述です。 RewriteCond に記述した条件が満たされた時のみ RewriteRule に記述したURLの書き換えと転送が実行されるようになります。

 RewriteCond は、RewriteRule 記述の直前に複数記述することができます。 RewriteCond を複数記述した場合には、複数の条件が全て一致した場合に RewriteRule を適用するのか(AND)、複数の条件のいずれかが一致した場合に適用するのか(OR) も指定することができます。

RewriteCond ディレクティブの書式

 RewriteCond ディレクティブの書式は、次の通りです。 それぞれの指定項目について、次で詳しく説明します。

RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]
RewriteRule ここにRewriteRuleのURL書換&転送設定を記述

フラグ

 項目「フラグ」の役割は2つがあります。

  1. RewriteCond の適用条件 AND/OR を切替える
  2. 条件判定に大文字/小文字の区別をするか否かを切替える

 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_VERSIONAPIバージョン
THE_REQUESTリクエスト文字列
REQUEST_URIリクエストURI
REQUEST_FILENAMEリクエストされたファイル名
IS_SUBREQサブリクエストか否か
HTTPSHTTPSでのアクセスか否か

下で記述しますが、それぞれの変数を利用したサンプルは別稿で説明したいと思います。

条件パターン

 条件パターンには正規表現を記述します。 上記の変数に代入されている文字列と比較するための正規表現です。 変数と正規表現の条件がマッチした際に、記述した RewriteCond の条件が成立(true)し、RewriteRule が実行されます。

使い方のサンプル

 ここまで RewriteCond について概要/仕様を説明をしてきました。 本連載では下記の記事で具体的な使い方とサンプルを説明しています。 是非、続けてそちらの記事もご覧頂ければ、より具体的な使い所がご理解頂けると思います。

おわりに

 本稿では RewriteCond ディレクティブの概要について解説しました。 次回からは RewriteRule の実践的な解説を行っていきます。 そちらもぜひご覧ください。

Apache httpd 入門へ戻る

Apacheのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca