Proxy Nginx pelo método de solicitação

14

É possível / como posso configurar um bloco de localização Nginx como proxy para diferentes backends, dependendo do método de solicitação (por exemplo, GET / POST)?

A razão é que eu estou atualmente lidando com os 2 métodos em 2 URLs diferentes (um via proxy http e outro via fcgi) e estou tentando torná-lo mais "REST" assim, idealmente gostaria de obter o recurso para retornar a lista, enquanto o POST no mesmo recurso deve ser adicionado à lista.

    
por Brenton Alker 19.06.2010 / 10:29

3 respostas

21

Eu não uso essa configuração, mas com base nos exemplos :

location /service  {
  if ($request_method = POST ) {
    fastcgi_pass 127.0.0.1:1234;
  }

  if ($request_method = GET ) {
     alias /path/to/files;
  }
}

Se você criar seu próprio aplicativo, também poderá considerar a verificação de GET / POST e o envio de X-Accel-Redirect cabeçalhos para entregar o transporte dos arquivos para o nginx.

    
por 19.06.2010 / 14:36
15

Embora você possa conseguir isso com if , isso geralmente é desencorajado pela documentação do Nginx , porque if não funciona bem com outras diretivas. Por exemplo, suponha que GET esteja aberto para todos, enquanto o POST é somente para usuários autenticados, usando HTTP Basic Auth. Isso exigiria que if fosse combinado com auth_basic , o que não funciona corretamente.

Aqui está uma alternativa que funciona sem if . O truque é usar "GET" e "POST" como parte dos nomes upstream, para que estes possam ser resolvidos por substituição de variáveis:

http {
  upstream other_GET {
    server ...;
  }
  upstream other_POST {
    server ...;
  }
  server {
    location /service {
      proxy_pass http://other_$request_method;
    }
  }
}

Para combinar isso com o HTTP Basic Auth para tudo, exceto GET, basta adicionar um limit_except bloco:

  ...
    location /service {
      proxy_pass http://other_$request_method;
      limit_except GET {
        auth_basic ...;
      }
    }
  ...
    
por 28.12.2016 / 18:06
0

Isso é o que eu fiz para fazer as coisas funcionarem para mim

add_header Allow "GET, POST, HEAD" always;
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
    proxy_pass http://back-end;
}
    
por 13.03.2018 / 07:24