2014/04/16

httpd mod_rewrite

■mod_rewrite は Apache の機能であり、モジュールを組み込むことで利用できる。
URL(ドメイン以下のパス)のリダイレクトや偽装、置き換えなどが行える。
一般的な正規表現を利用して RewriteRule を書くことができる。

・mod_rewrite.so
・httpd.conf にLoadModule rewrite_module modules/mod_rewrite.so

■RewriteCond
「RewriteCond」は、RewriteRule を実行するための条件を定義するための記述です。
 RewriteCond に記述した条件が満たされた時のみ RewriteRule に書いたURLの書き換えと転送が実行されるようにできます。
RewriteCond は、RewriteRule の記述部の前に複数個記述することができます。 RewriteCond を複数記述した場合には、複数の条件が全て一致した場合に RewriteRule を実行するのか(AND)、複数の条件のいずれかが一致した場合に実行するのか(OR) も指定することができます。


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

RewriteCond を複数指定した場合に AND/OR を切替えます。
フラグを記述せずに RewriteCond を複数行記述した場合は AND になります。
フラグに [OR] と記述した場合は OR になります
RewriteCond の条件比較を大文字と小文字を区別するか否かを切替えます。
[NC] と記述することで大文字と小文字を区別しなくなります。 (=NCを指定しないと区別します)

グループ    変数名        値・意味

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でのアクセスか否か



■RewriteRuleの書き方
RewriteEngine on
RewriteRule (.+)\.html$ /item/view.php?p=$1 [L]


この場合、Aにアクセスすると、Bを実行する。
ブラウザの表示は Aのまま。


RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$ [OR]
RewriteCond %{REMOTE_ADDR} ^87\.65\.43\.21$
RewriteCond %{REQUEST_URI} !^sorry\.html
RewriteRule .* /sorry.html
★= を使うと文字列として扱い、正規表現無効になる

Translation:

    IF their IP address is 12.34.56.78
    OR their IP address is 87.65.43.21
    AND the request is not for sorry.html
    THEN display the sorry.html page


RewriteCond %{REMOTE_ADDR} != 118.238.11.48|49|5[0-9]|6[0-3]

■■■■■Address Prefix

202.12.30.115というIPアドレスに対してネットマスク(境目を示す目印のようなもの)が255.255.255.0であった場合、
先頭から24ビット(3オクテット)までがネットワークを表し、後の8ビットはその中のホストを識別するために使われています。
この先頭から24ビットまでをアドレスプリフィックスと呼びます。アドレスプリフィックスはしばしば/(スラッシュ)を伴ってプリフィックス長とともに表記されます。
この例だと、202.12.30.0/24 あるいは 202.12.30/24 のように表記します。
/28==>11111111.11111111.11111111.11110000(255.255.255.)前から28位
1111=>16