【実践】.htaccessでアクセス制限~アクセスを拒否する書き方は?

■記事内に広告を含む場合があります。

このWordPressブログにちょっと困った方からアクセスが来ているので、アクセスを拒否できないか調べてみました。

そうしたら、.htaccessを修正することでアクセスの制限ができそうなことがわかりました。
でも、実際に試してみるとなかなか思うような動きにならなかったのですが、なんとか思った通りに動かすことができるようになりました。

そこで、せっかく調べたり実験したりしたので、この結果を記録に残そうと思います。
アクセスを制限する他にも.htaccessで色々できそうなので、調べたことも備忘録としてまとめてみます。

スポンサードリンク


特定ドメインからのアクセスを拒否するには?

特定ドメインからのアクセスを拒否するには、.htaccessでmod_rewriteモジュールの
RewriteCondディレクティブ
RewriteRuleディレクティブ
を使用します。

RewriteCondディレクティブは、対象となるアクセスを判別します。

ここで対象とするアクセスと判別された場合、その下にある
RewriteRuleディレクティブのルールに従った動作をします。
今回のケースでは、アクセスの拒否ですね。

アクセス解析から、そのアクセスをしてくるドメインやIPアドレスはわかっています。
そこで、今回はそのドメインからのアクセスをRewriteCondで判別すればいいので、こんな設定をしてみました。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REMOTE_HOST} ^(.*)\.hogehoeg\.ne\.jp$ [NC]
RewriteRule ^([0-9]*)\.html$ - [F,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

元々WordPressによって.htaccessが作られていたので、
6~7行目を追加してみました。

ところが、思ったように動きません。

とりあえず実験ということで、hogehoge.ne.jpの部分には、筆者がアクセスするドメインを設定しました。
ですので筆者がこのブログへアクセスすると403エラー(アクセスできない)が返ってくるはずなのですが、このブログが正常に表示されてしまいます。

そこで6行目のRewriteCondディレクティブの正規表現の書き方に問題があるのだと思い、色々と直してはアクセスしてみたのですが一向にアクセス制限がかかりません。
 

原因がわからないので、アクセスを判別する方法をドメイン名からIPアドレスに変更してみました。
ただIPアドレスの場合、同じドメインでも複数のIPアドレスからアクセスされるので複数の設定が必要になります。

今度はこんな設定にしてみました。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REMOTE_ADDR} xxx\.xxx\.xxx\.1 [OR] 
RewriteCond %{REMOTE_ADDR} xxx\.xxx\.xxx\.2 [OR] 
RewriteCond %{REMOTE_ADDR} xxx\.xxx\.xxx\.3
RewriteRule ^([0-9]*)\.html$ - [F,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

このようにIPアドレスを[OR]オプションでつなげて複数行書きます。

スポンサードリンク

RewriteCondディレクティブ行を複数行記述した場合、全ての条件を満たすとRewriteRuleディレクティブが実行されます。
IPアドレスの場合、どれか1つの行の条件が満たされればRewriteRuleディレクティブを実行したいので、こういう場合は[OR]オプションを付けます。

IPアドレスではアクセスの制限がうまくいき、筆者のアクセスが403エラーとなりました。

ドメイン名での判別の方がスマートなのですが、色々調べた結果リモートホスト名が取得できないのではないか?という結論に達しました。(筆者の正規表現に記述ミスがある可能性も残ってはいますが…)

ということで、.htaccessの記述を実際に制限をかけたいドメインのIPアドレスに変更して完了です。


.htaccessの書き方の備忘録

今回の.htaccess修正のためにいろいろと調べました。
アクセス制限だけでなくURLの書き換えなども行えるようで、色々なシーンで使えそうです。

ただ、このままでは忘れてしまうので、自分のための備忘録として調べたことをまとめてみます。

mod_rewriteについて

.htaccessだけでも、アクセス制限をかけたりbasic認証を行ったりリダイレクトを行ったりすることができるのですが、mod_rewriteモジュールを使うとよりきめ細かい制御を行うことができます。

mod_rewriteモジュールはApache Webサーバ自身の設定によって使えるかどうかが変わってきますので、使えるかどうかはサーバの管理者へ確認する必要があります。

.htaccessでmod_rewriteモジュールを有効化するためには以下のような記述が必要になります。

RewriteEngine On
RewriteBase /

WordPressが作った.htaccessには既にこの記述が入っていました。

RewriteRuleディレクティブ

URLの書き換えルールを記述するディレクティブです。
今回はアクセス制限を行いました。

RewriteCondディレクティブで対象となるアクセスと判断された場合に、パターンと一致したリクエストをルールに従って書き換えを行います。

【書式】RewriteRule パターン 置換対象 オプション

RewriteCondディレクティブ

リクエストのヘッダ情報やリクエストの環境変数その他の条件で書き換え対象かどうかを判別するディレクティブです。
書き換え対象と判断された場合、この次に現れるRewriteRuleディレクティブが実行されます。
今回はアクセス元のIPアドレスを判別しました。

【書式】RewriteCond テスト文字列 条件パターン オプション

 
少々長くなりそうなので、各ディレクティブの使い方の詳細やオプションの種類については、別ページに記載します。

スポンサードリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする