como obtenho o nginx para encaminhar pedidos HTTP POST via reescrita?

17

Meu app para 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 usual rewrite ^/(.*)$ http://mydomain/$1 permanent; , os dados POST serão perdidos.

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

    
por Jiho Kang 16.09.2011 / 10:41

1 resposta

27

Tente usar o suporte ao proxy reverso . Um exemplo da seção location 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 para esse server block para um segundo servidor em execução em localhost:8080 . Isso preserva POST e também deve preservar outros tipos de solicitações se isso se tornar um problema.

O problema é que os redirecionamentos externos nunca reenviarão POST data. Isso está escrito na especificação HTTP (marque a seção 3xx). Qualquer cliente que fizer isso está violando a especificação.

If the 301/302 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

Tenho quase certeza de que a maioria dos navegadores implementa isso simplesmente forçando a solicitação redirecionada a ser uma solicitação GET . Teoricamente, a especificação permite um navegador que pergunte ao usuário se deseja redirecionar os dados de POST , mas não tenho conhecimento de nenhum que faça atualmente.

    
por 16.09.2011 / 10:48