Web Developers Antenna 〜ウェブ開発者アンテナ〜 [W'ANEB]

Web Developers Antennaでは、開発ノウハウ、便利ツール、Web運用に関する情報を蓄積していきます。

*

Apache RewriteCond 〜 RewriteRuleの条件定義について

      2015/07/17

スポンサードリンク

Apache RewriteCond 〜 RewriteRuleの条件定義について

RewriteCond とは?

RewriteCondディレクティブは、RewriteRule を実行するための条件を定義するものです。
RewriteCond に記述した条件が満たされた時のみ RewriteRule に記述したとおりに、URLの書換え&転送が実行されます。
また、複数の条件を設定することも可能です。
※Rewrite Engine On 担っていることが前提です。

RewriteCond の書式例

RewriteCond %{REQUEST_URI} /
RewriteRule ^(.*)$ http://example.com/? [R=301,L]
RewriteCond の条件式
RewriteCond は、RewriteRule の記述部の前に複数行で記述することができます。
RewriteCond を複数行で記述した場合には、役割を指定できます。

役割には2つありまして、
・複数の条件が「全て一致した場合」もしくは「いずれかが一致した場合」に RewriteRule を実行する [AND/OR]
RewriteCond を複数指定した場合に AND/OR を切替えます。 フラグを記述せずに RewriteCond を複数行記述した場合は AND になります。
行の末尾に [OR] と記述した場合は OR になります。

・条件判定に大文字/小文字の区別をするか否かを切替える [NC]
その行の RewriteCond の条件比較を大文字と小文字を区別するか否かを切替えます。 [NC] と記述することで大文字と小文字を区別しなくなります。 (=NCを指定しないと区別します)

※両方記述する場合はコンマ区切りで記述。[OR,NC]

例A)一つの条件の場合
RewriteCond %変数名 条件
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述

例B)複数条件の場合 (AND条件)
RewriteCond %変数名 条件
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述

例C)複数条件の場合 (OR条件と1つ目の条件は大文字/小文字を区別しない場合の例)
RewriteCond %変数名 条件 [OR,NC]
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述

変数名
Apache では以下の変数が利用できます。
条件にあわせて利用する変数を選んでください。

グループ 変数名 値・意味
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 %{HTTP_REFERER} $^
RewriteRule ^.*$ [F]

#http://www.example.com を http://www.example.jpにとばす
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^/(.*) http://www.example.jp/$1

#すべてのアクセスをトップページに飛ばす
#ループをさけるため、トップページへのアクセスはリダイレクトをかけない
RewriteCond %{REQUEST_URI} !^/$
RewriteRule ^/.*$ http://www.example.com/ [R]

#変数名 hoge を aaa に書き換える (変数 hoge の出現位置が固定の場合)
RewriteCond %{QUERY_STRING} ^hoge=(.*)$
RewriteRule ^/$ /?aaa=%1 [R=302,L]

/ にアクセスした際のクエリ変数名「hoge」を「aaa」に書き換える設定です。 変数「hoge」が必ずクエリ文字列の最初に出現することが保証されている場合は、このように簡易的に記述できます。

第三引数 説明
[C] chain 次のRewriteRuleと条件を結合する(置換禁止文字列”-“を用いて複数の条件をANDで複合適用する場合に用いる)
[E] environment E=VAR:VAL 環境変数のセット。VAR という名前の環境変数の値を VAL に するよう指示します
[F] forbidden(403) マッチしたURLへのアクセスを禁止する(クライアントには”403 Forbidden”のレスポンスが返される)
[G] gone(410) マッチしたURLは行方不明であることを伝える(クライアントには”410 Gone”のレスポンスが返される)
[L] last 条件にマッチした場合そこで判定を終了する(以下に続くRewriteRuleを評価しない)
[N] next 書き換えが済んだURLを新たなリクエストとして書き換え処理を再度最初のルールから繰り返す
[P] proxy PROXYモジュールを使用して他のサーバー(URL)にあるコンテンツを取得しその内容をクライントに返す
[R] redirect “302 Moved Temporaily”のレスポンスを返しクライアントをリダイレクトする。[R=301] と書けば、”301 Moved Permanently”に変更することもできる
[S] skip 現在のルールがマッチしたら、次の’数字’番目のルールをスキップするよう指示します。これを使って、擬似的に if-then-else 構造を作ることができます
[NC] no case 大文字小文字を区別しない
[NE] no escape 書き換え結果に対して通常行なわれるURLエスケープルールを適用しないようにします。出力の中にパーセント文字を 使うことができます
[NS] no subrequest 一次的なURLリクエストの場合のみ条件を評価(サーバー内部で発せられるサブリクエストの場合は判定をスキップする)
[OR] or 条件をorでつなぐ(背反する and は暗黙であるため、何も書かなければ and として扱われる)
[PT] pass through mod_alias と mod_rewrite の同時使用時などで使用する
[QSA] query string append 置換文字列の中でマッチしたものを書き換えるのではなく、そこにクエリー文字列部分を追加するように書き換えエンジンに強制します。書き換えルールを通してクエリー文字列に何かデータを追加したい場合にこのフラグを使います

 - Apache関連 ,