come posso ottenere nginx per inoltrare richieste POST HTTP tramite riscrittura?


19

La mia app iOS sta attualmente accedendo al dominio A tramite http POST ma vorrei inoltrare tutte le richieste al dominio B.

Se uso il solito rewrite ^/(.*)$ http://mydomain/$1 permanent;i dati POST sembrano perdersi.

Come posso passare i dati HTTP POST a un dominio diverso usando NginX?

Risposte:


32

Prova invece a utilizzare il supporto proxy inverso . Una locationsezione di esempio sarebbe:

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;
}

Questo esempio passerà attraverso tutte le richieste a questo serverblocco a un secondo server in esecuzione localhost:8080. Ciò preserva quello POSTe dovrebbe anche preservare anche altri tipi di richieste se dovesse mai diventare un problema.

Il problema è che i reindirizzamenti esterni non rispediranno mai iPOST dati. Questo è scritto nelle specifiche HTTP (controlla la sezione 3xx). Qualsiasi client che lo fa viola le specifiche.

Se il codice di stato 301/302 viene ricevuto in risposta a una richiesta diversa da GET o HEAD, l'agente utente NON DEVE reindirizzare automaticamente la richiesta a meno che non possa essere confermata dall'utente, poiché ciò potrebbe modificare le condizioni in cui è stata emessa la richiesta .

Sono abbastanza sicuro che la maggior parte dei browser lo implementa semplicemente forzando la richiesta reindirizzata a essere una GETrichiesta. Teoricamente, le specifiche consentono un browser che chieda all'utente se reindirizzare i POSTdati, ma non sono a conoscenza di ciò che attualmente lo fa.


stupendo! funziona come un incantesimo
Jiho Kang

un po 'confuso dal commento. In genere desidero impostare i proxy_set_headervalori? Altrimenti immagino che l'indirizzo remoto diventi l'indirizzo remoto del server proxy ma quello che di solito voglio è l'indirizzo remoto del client, giusto?
Georgios Pligoropoulos,

Grazie per la risposta che mi ha salvato! Esiste un modo per configurare nginx in modo che passi correttamente le richieste post a uwsgi ma con socket invece di eseguire uwsgi in modalità http?
Greg Jennings,

@GregJennings Un po 'in ritardo per una risposta, ma si userebbe la direttiva' uwsgi_pass 'invece di' proxy_pass '. Nel caso qualcun altro vaga guardando ...
Kamilion

1
@Will proxy_redirectaccetta due argomenti. Vedi la documentazione: nginx.org/it/docs/http/…
Matthew Scharley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.