torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

mod_rewrite、IPアドレスでの制限(範囲)

Apache Apacheモジュール
2016年4月8日7:38
下記コードは、 http://host.com/test 以下へのアクセスで
14.101.147.76からのアクセスをerror.htmlへ移動させます。
<Directory /var/www/html/test>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^14\.101\.147\.76
RewriteRule ^(.*)$ error.html
</Directory>


下記の場合は、14.101なIPアドレスは全てerror.htmlへ移動させます。
<Directory /var/www/html/test>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^14\.101
RewriteRule ^(.*)$ error.html
</Directory>


下記は、14.101.141.0から14.101.199.255までの制限です。少しややこしくなってきましたね。
[OR]をつけない場合、ANDという意味になってしまいます。
<Directory /var/www/html/test>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^14\.101\.14[1-9] [OR]
RewriteCond %{REMOTE_ADDR} ^14\.101\.1[5-9][0-9]
RewriteRule ^(.*)$ error.html
</Directory>


よく、下記のようにコンマをエスケープしていない書き方を見ます。
「.」には全ての文字が入るため、結果的にIPアドレスの「.」もマッチするということです。
基本的にはこの書き方も問題ありません。
<Directory /var/www/html/test>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^14.101
RewriteRule ^(.*)$ error.html
</Directory>


意図しない動作があるとすれば、次のケース
この設定をし、14.101.147.76のIPアドレスでアクセスすると、error.htmlへ遷移します。
設定しているのは14.1.1.1なのに、不思議ですね。
<Directory /var/www/html/test>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^14.1.1.1
RewriteRule ^(.*)$ error.html
</Directory>


「.」には、どんな文字でもいいよ、という意味があるのは上で書きました。
なので、以下の指定は
RewriteCond %{REMOTE_ADDR} ^14.1.1.1


という解釈もできるため、
RewriteCond %{REMOTE_ADDR} 14(文字列としてのドット)1(数字の0)1(文字列としてのドット)1


このようなIPアドレスも含む、ということになります。14.101.147もマッチすることになりますね。
RewriteCond %{REMOTE_ADDR} ^14.101.1


上記は特殊なケースではありますが、基本的にRewriteCondでは\.というように書くことをお勧めいたします。

この最初に「^」を書いておくことを忘れないようにしましょう。
そこまで問題にはなりませんが、下記のアドレスは1.101.147や200.101.147も制限されます。
RewriteCond %{REMOTE_ADDR} 101\.147\.


以下のような指定も気をつけましょう。
この場合14.1は勿論ですが、14.10や14.100なども軒並み制限されます。
RewriteCond %{REMOTE_ADDR} ^14\.1


以下のようにするとグッドです。
RewriteCond %{REMOTE_ADDR} ^14\.1\.


最後に\.と書けない場合があります。14.1.1.10から14.1.1.99まで指定したい場合などです。
以下は14.1.1.100も制限されてしまいます。
RewriteCond %{REMOTE_ADDR} ^14\.1\.1\.[1-9][0-9]


この場合は、以下のようにしましょう。
RewriteCond %{REMOTE_ADDR} ^14\.1\.1\.[1-9][0-9]$


気をつける点をまとめると
・IPアドレスの最初には「^」を使っておく
・「.」ではなく「\.」を使う
・最後の指定が3桁ではなく、かつ1か2で始まる指定の場合は末尾に\.とつける
・さらにそれが4番目の指定だった場合は、IPアドレスの最後を示すため\.ではなく$をつける