¿Cómo consigo nginx para reenviar solicitudes HTTP POST a través de reescribir?

19

Mi aplicación iOS actualmente está accediendo al dominio A a través de http POST pero me gustaría reenviar todas las solicitudes al dominio B.

Si uso lo habitual, rewrite ^/(.*)$ http://mydomain/$1 permanent;los datos POST parecen perderse.

¿Cómo puedo pasar datos HTTP POST a un dominio diferente usando NginX?

Jiho Kang
fuente

Respuestas:

32

Intente utilizar el soporte de proxy inverso en su lugar. Una locationsección de ejemplo sería:

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 ejemplo pasará todas las solicitudes a este serverbloque a un segundo servidor en ejecución localhost:8080. Esto preserva POSTy también debe preservar otros tipos de solicitud si alguna vez se convierte en un problema.

El problema es que las redirecciones externas nunca reenviarán POSTdatos. Esto está escrito en la especificación HTTP (consulte la sección 3xx). Cualquier cliente que haga esto está violando la especificación.

Si se recibe el código de estado 301/302 en respuesta a una solicitud que no sea GET o HEAD, el agente de usuario NO DEBE redirigir automáticamente la solicitud a menos que pueda ser confirmada por el usuario, ya que esto podría cambiar las condiciones bajo las cuales se emitió la solicitud .

Estoy bastante seguro de que la mayoría de los navegadores implementan esto simplemente forzando que la solicitud redirigida sea una GETsolicitud. Teóricamente, la especificación permite un navegador que le pregunte al usuario si debe redirigir los POSTdatos, pero no estoy al tanto de ninguno que lo haga actualmente.

Matthew Scharley
fuente
impresionante! funciona como un encanto
Jiho Kang
un poco confundido por el comentario. ¿Generalmente quiero establecer los proxy_set_headervalores? De lo contrario, supongo que la dirección remota se convierte en la dirección remota del servidor proxy, pero lo que generalmente quiero es la dirección remota del cliente, ¿correcto?
Georgios Pligoropoulos
¡Gracias por la respuesta que me salvó! ¿Hay alguna manera de configurar nginx para que envíe las solicitudes de publicación correctamente a uwsgi pero con sockets en lugar de ejecutar uwsgi en modo http?
Greg Jennings
@GregJennings Un poco tarde para una respuesta, pero uno usaría la directiva 'uwsgi_pass' en lugar de 'proxy_pass'. En caso de que alguien más
deambule
1
@Will proxy_redirecttoma dos argumentos. Ver los documentos: nginx.org/en/docs/http/…
Matthew Scharley