Webサーバを運用していて特定のファイルにアクセスがきたら特定の処理を実施させたい場合があります。こういった場合はApacheのmod_rewriteモジュールを使って実現することができます。
■RewriteCondとRewriteRuleについて
RewriteCondは条件を指定するもの。RewriteRuleは処理を実施するものです。
RewriteCondは複数指定することができ、特に明示しなければAND条件になります。ORとする場合にはOR明示が必要です。
また、RewriteCondはデフォルトで大文字小文字の区別します。区別させたくない場合はNC明示が必要です。
以下はサンプルとなります。
例:特定の条件に大文字小文字を区別せずマッチした場合に処理を実施
RewriteCond %{変数名} 条件 [NC] RewriteRule 処理実施 |
例:複数の条件に大文字小文字を区別せず、いずれかにマッチした場合に処理を実施
RewriteCond %{変数名} 条件 [NC,OR] RewriteCond %{変数名} 条件 [NC] RewriteRule 処理実施 |
■変数名について
条件に指定する変数名について、実務で多く使うもので主に以下のものがあります。
変数名
|
値、書式
|
%{HTTPS} | onまたはoff。onの場合はhttpsが有効でoffの場合はhttpsが無効である。 |
%{REMOTE_ADDR} | 送信元アドレス。 ^192\.168\.0は192.168.0.0/24 !^192\.168\.0は192.168.0.0/24以外を表す。 |
%{REQUEST_FILENAME} | アクセスしようとしているファイル名。 !-fはファイルが存在しない、!-dはディレクトリが存在しない、要は何も存在しなかったということ。 ^/html/index.htmlとすればhtml/index.htmlにアクセスということを表す ^(.*)\.(gif|png|jpg|jpeg|css)$ とすれば画像ファイルにアクセスしたことを表す |
%{REQUEST_URI} | リクエストしたURL ^/$はトップページを表す。 !(^/example/.*$)はexample配下の任意以外のものを表す。 |
%{HTTP_USER_AGENT} | ブラウザに何を使用しているか。PCかスマホなのかなどの判別もつくことができる。 ^DoCoMo|Nokia|WILLCOM は主なガラケーを表す。 ^(iPhone|iPod|BlackBerry|Windows Phone|Android)は主なスマートフォンを表す。 |
■実際の使用例
上記を踏まえて実際の使用例をいくつか記述します。
例:HTTPでアクセスしてきたユーザの特定IPには302、それ以外は301を返す
RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off RewriteCond %{REMOTE_ADDR} ^192\.168 [OR] RewriteCond %{REMOTE_ADDR} ^172\.16 RewriteRule ^(.*)$ https://www.unix-power.net/$1 [L,R=302] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.unix-power.net/$1 [L,R=301] |
RewriteRuleのLはLastのLで、書き換え終了という意味です。Rはコードを意味し、何も明示しなければ302になります。301は恒久的な移動、302は暫定的な移動を意味します。
その他にも多数のコードがありますので、こちらのページを参照ください。
例:アクセスしたファイルやディレクトリが存在しないときに特定ページにアクセスさせる
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(.*)\.(ico|bmp|gif|jpe?g|png|zip|xls|doc|ppt|wmv)$ [NC]
RewriteRule ^.*$ index.php [L]
|
例:スマートフォンからのアクセスは特定ページにジャンプさせる
RewriteEngine On RewriteBase / RewriteCond %{HTTP_USER_AGENT} ^(iPhone|iPod|BlackBerry|Windows Phone|Android) [NC] RewriteRule ^(.*)$ /phone/index.html [L,R=301] |
例:トップページにアクセスがあったら特定URLにジャンプさせる
RewriteEngine On RewriteRule ^/$ /jump-to-url/ [L,R=301] |