現在、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...
}
)
コアダンプが言ったように、いいえ、複数の場所を使用します。
ただし、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
ブロックの外側に配置することをお勧めします。
通常、このような場合、「ネストされた場所」を支援できます...
location / {
root /var/www/docs;
allow all;
location /admin {
deny 1.2.3.4;
}
}
...しかし、すべてのディレクティブがネストされた場所で継承されるわけではありません。残念ながら、正確にproxy_pass
、fastcgi_pass
や類似のものは継承されません...したがって、(@ namedlocationを使用して)以前に提案されたソリューションは、この場合は正しいです。もちろん、「proxy_passブロック」にディレクティブinclude
を使用することもできます。
最初に、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; }
#...
}