nginx根据一个“位置”中的URI阻止IP

目前有一个位置/

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

需要通过IP进行过滤。

理想情况下,为了减lesslocation相同指令的重复次数,我想在location块内执行testing

  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中,“allow”指令是不允许的 

有没有一个优雅的方式来执行testing,而不重复的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... } 

像coredump说,不,使用多个地点。

但有可能使location块的内容重复性较低。 这里的关键是一个命名的location块,其中包含rootproxy_...指令。

例如:

 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; } } 

…但不是所有在嵌套位置inheritance的指令。 可悲的是,但是正确的proxy_passfastcgi_pass和类似的没有被inheritance…因此,前面提出的解决scheme(带有@namedlocation)在这种情况下是正确的。 当然,你也可以使用一个include “proxy_pass block”的指令。

没有。使用多个locations ,它可能看起来很丑,但如果疯狂的话,你会以较less的机会结束。

另外请记住,nginx首先处理正则expression式匹配,如果没有匹配,则尝试最具体的文字位置,即捕获所有位置的location /种类。 知道你可能会减less你需要的位置数量。 看看这个文档 ,看看如何处理请求。

首先你必须定义一个variables来保存你的IPfilter。 这进入了nginxconfiguration的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; } 

然后在服务器部分中编写if结构,并通过variables$ allowed的内容过滤访问位置:

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