Substituindo regra de negação de nginx para um único bloco de localização

3

Eu tenho uma configuração nginx como essa, em que um servidor deve ser principalmente privado (somente um determinado endereço IP pode usar o servidor), exceto por um bloco location que deve estar disponível publicamente:

server {
  listen  443 ssl default;

  # Allow access only from certain IP addresses
  allow   12.34.56.78/32;
  allow   10.0.2.2/32;
  deny    all;

  # Proxy dynamic requests to the app
  location / {
    proxy_pass  http://127.0.0.1:8000;
  }
  # Serve static assets from disk
  location = /favicon.ico {
    alias  /var/www/example.com/htdocs/static/images/favicon.png;
  }
  location /static {
    alias  /var/www/example.com/htdocs/static;
  }
  ...

  # Allow public access to this endpoint
  location = /public/endpoint {
    proxy_pass  http://127.0.0.1:9000;

    # Allow *all* IPs here, so that they don't hit the server "deny" rule
    # [except this doesn't seem to work...]
    allow 0.0.0.0/0;
  }
}

No entanto, adicionar essa regra allow no bloco location público no final não funciona - solicitações de IPs que não estão na lista acima são rejeitadas.

Mover a regra deny all do bloco server para cada um dos blocos location não públicos também não tem o efeito esperado.

Existe uma maneira de implementar o comportamento desejado, sem ter que copiar todo o conjunto de regras "permitir, permitir, permitir, negar" em cada bloco location não público?

    
por Christopher 19.05.2014 / 19:13

1 resposta

3

Você deve usar apenas allow all

location = /public/endpoint {
    proxy_pass  http://127.0.0.1:9000;

    # Allow *all* IPs here, so that they don't hit the server "deny" rule
    allow all;
}

Além disso, se você usar diferentes tipos de restrições, talvez seja necessário adicionar satisfy any; para que funcione.

    
por 19.05.2014 / 19:33

Tags