web-dev-qa-db-ja.com

1つの「場所」のURIに基づいてnginxブロックIP

現在、1つの場所のブロックがあります/

  location / {
    root  /var/www/docs;
    proxy_pass  http://backend;
    proxy_buffering     on;
    proxy_buffer_size   64k;
    proxy_buffers       256   64k;
  }

iPでフィルタリングする必要があります。

理想的には、location内の同じディレクティブの繰り返し回数を減らすために、locationブロック内でテストを実行したいと思います

  location / {

    if ($uri ~ '^/(abc|def|ghi)') {
        allow 10.0.0.0/8;
        allow 1.2.3.4;
        deny all;
    }

    root  /var/www/docs;
    proxy_pass  http://backend;
    proxy_buffering     on;
    proxy_buffer_size   64k;
    proxy_buffers       256   64k;
  }

残念ながら、allow/denyディレクティブはifブロック内では使用できないようです。

「許可」ディレクティブは/ etc/nginx/sites-enabled/mysite:20では許可されていません

locationブロックを繰り返さずにテストを実行するエレガントな方法はありますか?

(お気に入り

  location ~ /(abc|def|ghi) {

        allow 10.0.0.0/8;
        allow 1.2.3.4;
        deny all;

        ... 5 other lines root,proxy...
   }

  location  / {

        ... 5 other lines root,proxy...
   }

5
Ring Ø

コアダンプが言ったように、いいえ、複数の場所を使用します。

ただし、locationブロックの内容の繰り返しを少なくすることは可能です。ここでのキーは、locationおよびproxy_...ディレクティブを含む名前付きのrootブロックです。

例えば:

location / {
  try_files $uri @proxy;
}
location ~ /(abc|def|ghi) {
  allow 10.0.0.0/8;
  allow 1.2.3.4;
  deny all;

  try_files $uri @proxy;
}
location @proxy {
  root  /var/www/docs;
  proxy_pass  http://backend;
  proxy_buffering     on;
  proxy_buffer_size   64k;
  proxy_buffers       256   64k;
}

また、rootディレクティブをすべてのlocationブロックの外側に配置することをお勧めします。

5
Koen.

通常、このような場合、「ネストされた場所」を支援できます...

location / {
   root /var/www/docs;
   allow all;

   location /admin {
       deny 1.2.3.4;
   }

}

...しかし、すべてのディレクティブがネストされた場所で継承されるわけではありません。残念ながら、正確にproxy_passfastcgi_passや類似のものは継承されません...したがって、(@ namedlocationを使用して)以前に提案されたソリューションは、この場合は正しいです。もちろん、「proxy_passブロック」にディレクティブincludeを使用することもできます。

2
cadmi

いいえ。複数のlocationsを使用してください。見栄えは悪くなりますが、 クレイジーな場合 の可能性は少なくなります。

また、nginxは最初に正規表現の一致を処理し、一致するものがなければ、_location /_の種類のcatch allの場所である最も具体的なリテラルの場所を試みます。必要な場所の数を減らすことができることを知っている。 このドキュメント を見て、リクエストの処理方法を確認してください。

2
coredump

最初に、IPフィルターを保持する変数を定義する必要があります。これはnginx設定のhttpセクションに入ります:

map $remote_addr (or $http_x_forwarded_for if behind a proxy) $allowed {
        default deny;
        ~\s*111.222.333.444$ allow;
        ~\s*333.444.555.*$   allow;
    }

次にserverセクションでif構文を記述し、変数$ allowedの内容でアクセス場所をフィルターします。

location / {
        if ( $allowed = "deny" ) { return 403; }
        #...
    }
2
manyk