Apache RewriteCond 〜 RewriteRuleの条件定義について
2015/07/17
スポンサードリンク
Apache RewriteCond 〜 RewriteRuleの条件定義について
Contents
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 置換文字列の中でマッチしたものを書き換えるのではなく、そこにクエリー文字列部分を追加するように書き換えエンジンに強制します。書き換えルールを通してクエリー文字列に何かデータを追加したい場合にこのフラグを使います |