web-dev-qa-db-ja.com

Nginx-特定のIPを持つユーザーを特別なページにリダイレクトする方法

私は非常に大きな画像ギャラリーを運営しており、毎日Webコピー機を使用してサイト全体をダウンロードすることで膨大な量のトラフィックを生み出している5人の訪問者がいます。それらの訪問者は、見たところ静的IPを持っています。私が達成したいのは、これらの5つのIPが、サイトにアクセスするとすぐに、特定のページ(動作に問題がある理由を説明する)にリダイレクトされることです。他のすべての訪問者は通常どおりサイトを閲覧できるはずです。

サーバーはウェブサーバーとしてCentOS(5.8)とnginx(1.0.15)を実行しています。あなたが知っているnginx.confのエントリによってこれを達成する方法はありますか?

ヒントとサポートをよろしくお願いします!

敬具-アレックス

27
Alex

Geo モジュールは、クライアントアドレスを照合するために作成されます。これを使用して、次のようにテストする変数を定義できます。

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
  if ($bad_user) {
    rewrite ^ http://www.example.com/noscrape.html;
  }
}

これは、$ remote_addrに対して正規表現を実行するよりも効率的で、保守が簡単です。

35
kolbyjack

HttpAccessModule を使用すると、これをすばやく実現できます。

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
20
user74078

同じドメインの別のページにリダイレクトした場合、上記の例に従っていると、直接ループが発生します。 nginx設定ファイルでは、次のように使用します(wordpressが広く使用されているので、使用することを想定しています)

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
 location /
 {
  if ($bad_user) {
    rewrite ^ http://www.example.com/warning-page/ break;
  }

try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
 }

location /warning-page/
{
try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
}

}

これで、ブラックリストに登録されたIPの誰かが、サイトにリストされていない警告ページ以外のページにアクセスした場合、警告ページにリダイレクトされます。書き換えは場所/ブロック内にあるため、リダイレクトループは発生しません。ただし、サーバーブロック内にある場合は、リダイレクトループが発生します。

2
Don Dilanga