como faço para o nginx encaminhar solicitações HTTP POST via reescrita?


19

No momento, meu aplicativo iOS está acessando o domínio A via http POST, mas gostaria de encaminhar todas as solicitações para o domínio B.

Se eu usar o habitual, rewrite ^/(.*)$ http://mydomain/$1 permanent;os dados do POST parecerão perdidos.

Como posso passar dados HTTP POST para um domínio diferente usando o NginX?

Respostas:


32

Tente usar o suporte ao proxy reverso . Uma locationseção de exemplo seria:

location / {
  proxy_pass      http://localhost:8080;
  proxy_redirect  http://localhost:8080/ /;
  proxy_read_timeout 60s;

  # May not need or want to set Host. Should default to the above hostname.
  proxy_set_header          Host            $host;
  proxy_set_header          X-Real-IP       $remote_addr;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
}

Este exemplo passará por todas as solicitações desse serverbloco para um segundo servidor em execução localhost:8080. Isso preserva POSTe também deve preservar outros tipos de solicitação, se algum dia se tornar um problema.

O problema é que os redirecionamentos externos nunca reenviam POSTdados. Isso está escrito na especificação HTTP (consulte a seção 3xx). Qualquer cliente que faz isso está violando as especificações.

Se o código de status 301/302 for recebido em resposta a uma solicitação que não seja GET ou HEAD, o agente do usuário NÃO DEVE redirecionar automaticamente a solicitação, a menos que possa ser confirmada pelo usuário, pois isso pode alterar as condições sob as quais a solicitação foi emitida. .

Tenho certeza de que a maioria dos navegadores implementa isso simplesmente forçando a solicitação redirecionada a ser uma GETsolicitação. Teoricamente, a especificação permite um navegador que pergunte ao usuário se deve redirecionar os POSTdados, mas não conheço nenhum que atualmente o faça.


impressionante! funciona como um encanto
Jiho Kang

um pouco confuso com o comentário. Eu geralmente quero definir os proxy_set_headervalores? Caso contrário, acho que o endereço remoto se torna o endereço remoto do servidor proxy, mas o que eu normalmente quero é o endereço remoto do cliente, correto?
Georgios Pligoropoulos

Obrigado pela resposta que me salvou! Existe uma maneira de configurar o nginx para que ele repita solicitações de postagem corretamente de volta ao uwsgi, mas com soquetes, em vez de executar o uwsgi no modo http?
Greg Jennings

@GregJennings Um pouco atrasado para uma resposta, mas alguém usaria a diretiva 'uwsgi_pass' em vez de 'proxy_pass'. Apenas no caso de alguém vagar olhando ...
Kamilion 16/04

1
@Will proxy_redirectleva dois argumentos. Veja os documentos: nginx.org/en/docs/http/…
Matthew Scharley
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.