【.htaccess】mod_rewrite モジュール – その2 RewriteCond ディレクティブ

mod_rewrite モジュールを利用してリダイレクト方法の基本について、前回まとめました。

今回は、RewriteCond ディレクティブについてまとめます。これを利用することによって、RewriteRule の条件を更に定義することができます。
具体的によく利用されるものとしては、「wwwありなし設定」、「index.htmlありなし設定」、「https(SSL)へリダイレクト」などが行えます。

RewriteCondの基本構文

RewriteEngine On
RewriteCond テスト文字列  条件パターン  [フラグ]
RewriteRule 条件  置換文字列 [フラグ]

RewriteCond は、RewriteRule の前に、一つ以上設置できます。複数設置した場合は、フラグによって、OR 条件、AND 条件を指定できます。(省略すると AND になります。)

RewriteCond に利用できるフラグ(オプション)

フラグ 説明
[OR] 連続する RewriteCond のいずれかが true の場合に実行。省略時は、AND 条件として処理。
[NC] 条件を評価する時、大文字小文字を区別しない。

RewriteRule にも条件が記述されているわけですが、条件のマッチングから置換までの流れはこのようになります。

RewriteRule 条件

RewriteCond テスト文字列

RewriteCond 条件パターン

RewriteRule 置換文字列

RewriteRule の条件と置換の間に、RewriteCond の条件が入れ子になっているような順番となります。

RewriteCond の「テスト文字列」には「HTTP 環境変数」
RewriteCond の「条件パターン」には「演算子」が利用できます。
それぞれまとめます。

RewriteCond で利用できる HTTP 環境変数(テスト文字列)

HTTPリクエストヘッダの情報は “%{環境変数名}” と指定することで RewriteCond で利用できます。
例えば「HTTP_HOST」という環境変数は、リクエスト先のホスト名 (DNS 名) 情報を示し、” %{HTTP_HOST} ” とすると、http://www.hazu.jp/~” でアクセスがあった場合、” www.hazu.jp ” という DNS 名が返されます。

RewriteCond で利用できる主な環境変数の一覧です。

種類 環境変数名
ヘッダ環境変数 HTTP_HOST, HTTP_USER_AGENT, HTTP_REFERER, HTTP_ACCEPT
サーバー環境変数 SERVER_NAME, SERVER_ADDR, SERVER_PORT
リクエスト環境変数 EMOTE_ADDR, REMOTE_HOST, REMOTE_USER, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING
日付・時刻変数 TIME_YEAR, TIME_MON, TIME_DAY, TIME_TIME_HOUR, TIME_MIN, TIME_SEC, TIME
その他 THE_REQUEST, REQUEST_URI, REQUEST_FILENAME, HTTPS

それぞれの環境変数の意味や、値の例をこちらにまとめました。
mod_rewrite モジュール – その4 HTTP 環境変数一覧

RewriteCond で利用できる演算子(条件パターン)

条件に一致するものを選び出すのに演算子、正規表現が利用できます。
RewriteCond 利用できる主な演算子の一覧です。

演算子 説明
! 否定
< テスト文字列より大きい場合は true
> テスト文字列より小さい場合は true
= テスト文字列と等しい場合は true
<= テスト文字列以上の場合は true
>= テスト文字列以下の場合は true
-d テスト文字列のディレクトリが存在する場合 true
-f テスト文字列のファイルが存在する場合 true
-s テスト文字列のファイルが存在し、サイズが0byteでない場合 true

RewriteCond における後方参照

後方参照については、前にこちらにまとめました。
後方参照

RewriteRule において、後方参照は、” $n “ と表記されますが、
RewriteCond においては、” %n “ と表されます。

二つを同時に利用できるように、別の表記となっているのだと思います。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^(.*)/(.*)/index.html$
#                               ↑"%1" ↑"%2"
RewriteRule ^/blog/(.*)/(.*)$ /$1/%1/$2/%2
#                 ↑"$1" ↑"$2"   後方参照 ↑

.htaccess についてのあと、毎回言っていますが、最後に空行が必要です。お忘れなく。