Nginx でdeny(アクセス拒否 : 403 )するには
前回、「Nginx でリダイレクト ( rewrite ) するには」でnginx におけるリダイレクトについて簡単に解説しました。
今回も引き続き、apache からnginx への移行するための環境設定を行ってみます。
その中でも今回は、アクセス拒否 ( deny : 403 )に関してです。
apacheでは .htaccess を使ってのアクセス拒否 ( deny : 403 ) は簡単に行うことができます。
nginxでは、何でも設定ファイル(/etc/nginx/nginx.conf)で実現します。
これも結論から言うと、
if文を使って、
return 403; で HTTP ステータス番号を発行するだけなんです。
簡単な例をあげて解説してみましょう。
nginx でdeny(アクセス拒否 : 403 )する
nginx でdeny(アクセス拒否 : 403 )するには、
apacheでは、.htaccessにて設定していた内容を、nginxでは、設定ファイル(/etc/nginx/nginx.conf)で行うだけです。
やり方もそれほど難しくはないので、簡単にやってみましょう。
Apacheでのdeny(アクセス拒否 : 403 )の例
deny(アクセス拒否 : 403 )するには、
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
1
2
3
4
5
6
7
| SetEnvIfNoCase User-Agent "baidu.*" deny_f
SetEnvIfNoCase Referer "^http://www\.baidu\.jp" deny_f
...
order allow,deny
allow from all
deny from env=deny_f
deny from 111.222.111.222
|
これは、以下のような意味になります。
- 1行目:ユーザエージェント名が、baidu(大文字小文字を区別しない)が含まれているなら、deny_fを設定しなさい。
- 2行目:リファラー(アクセス元)が、http://www.baidu.jp(大文字小文字を区別しない)からなら、deny_fを設定しなさい。
- 4行目:アクセスの規制の順番を指定します。ここでは、許可(allow)、拒否(deny)の順番で指定します。
- 5行目:全てのアクセスを許可します。
- 6行目:deny_fが設定されている場合は、アクセスを拒否します。
- 7行目:IPアドレス 111.222.111.222 からのアクセスなら拒否します。
一時期、悪名高かった百度(baidu)の拒否パターンです。
最近は、ちゃんとrobots.txtに従うみたいですが、以前は、めちゃくちゃで、百度だけでかなりのCPU負荷を上げてしまうぐらいでした。
そのため、設定例が残っていたので、例として使わせてもらいました。
百度(baidu)さん、
Nginxでのdeny(アクセス拒否 : 403 )の例
先のApacheでの例を nginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
server {
server_name www.example.com;
...
set $deny_f 0;
if ( $http_user_agent ~* 'baidu' ){
set $deny_f 1;
}
if ( $http_referer ~* '^http://www\.baidu\.jp' ){
set $deny_f 1;
}
:
if ( $remote_addr = '111.222.111.222' ){
set $deny_f 1;
}
if ( $deny_f = 1) {
return 403;
}
...
}
|
この色の箇所が、編集箇所でdeny(アクセス拒否 : 403 )を実施している箇所になります。
if文の判定に使われている~* は、
大文字小文字を区別しないで一致するものという意味ですから、
上記のapacheの設定と対比させてば、よく理解できると思います。
if文での判定記号には以下の3つがあります。
~ :右辺の文字列が左辺に含まれるか比較します。
~* : 大文字小文字を区別しないで、右辺の文字列が左辺に含まれるか比較します。
= :左辺と右辺が全く同じか比較します。
if文は、必ず、括弧(の前にブランク(半角空白)を入れるようしましょう。
if( xxxx = YYYY ) のようにifの後にブランク(半角空白)を入れないと構文エラーでうまく読み込んでしてくれないようです。
x if( xxxx = YYYY )
o if ( xxxx = YYYY )
if文は、
server, locationの内でしか使えません。
最後の
return 403;
がHTTP ステータス番号 403の発行して終了するという意味になります。
もちろん、403でなく例えば404(ページなし)を設定することもできます。
このようにnginxでも同じようにdeny(アクセス拒否 : 403 )ができます。
if文の条件で、serverの設定情報の内でしか使えませんから、
全てのサーバーで共通てきなリダイレクト処理を行いたい場合などは、
1つのファイルにまとめて各サーバーでinclude文を挿入することになるのだと思います。
apacheの、.htaccessの書き方より、プログラミングっぽいですね。
個人的には、nginxがすっきりしていて好きですが、どうでしょうか?
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :