目前有一个位置块/
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块,其中包含root和proxy_...指令。
例如:
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_pass , fastcgi_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; } #... }