Wie kann ich erreichen, dass Nginx HTTP-POST-Anforderungen per Neuschreiben weiterleitet?

19

Meine iOS-App greift zurzeit über http POST auf Domäne A zu, ich möchte jedoch alle Anforderungen an Domäne B weiterleiten.

Wenn ich das übliche rewrite ^/(.*)$ http://mydomain/$1 permanent;verwende, scheinen die POST-Daten verloren zu gehen.

Wie kann ich HTTP-POST-Daten mit NginX an eine andere Domain übergeben?

Jiho Kang
quelle

Antworten:

32

Versuchen Sie stattdessen, die Reverse-Proxy-Unterstützung zu verwenden. Ein Beispielabschnitt locationwäre:

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

In diesem Beispiel werden alle Anforderungen an diesen serverBlock an einen zweiten Server weitergeleitet, auf dem ausgeführt wird localhost:8080. Dies bewahrt POSTund sollte auch andere Anfragetypen bewahren, falls dies jemals zu einem Problem wird.

Das Problem ist, dass externe Weiterleitungen niemalsPOST Daten erneut senden . Dies wird in die HTTP-Spezifikation geschrieben (siehe Abschnitt 3xx). Jeder Client, der dies tut, verstößt gegen die Spezifikation.

Wenn der Statuscode 301/302 als Antwort auf eine andere Anforderung als GET oder HEAD empfangen wird, DARF der Benutzeragent die Anforderung NICHT automatisch umleiten, es sei denn, er kann vom Benutzer bestätigt werden, da dies die Bedingungen ändern kann, unter denen die Anforderung ausgestellt wurde .

Ich bin mir ziemlich sicher, dass die meisten Browser dies implementieren, indem sie die umgeleitete Anforderung einfach als GETAnforderung erzwingen . Theoretisch erlaubt die Spezifikation einen Browser, der den Benutzer fragt, ob die POSTDaten umgeleitet werden sollen, aber mir sind derzeit keine bekannt.

Matthew Scharley
quelle
super! funktioniert wie ein Zauber
Jiho Kang
Ein bisschen verwirrt vom Kommentar. Möchte ich im Allgemeinen die proxy_set_headerWerte einstellen ? Ansonsten denke ich, dass die Remoteadresse die Remoteadresse des Proxy-Servers wird, aber was ich normalerweise möchte, ist die Remoteadresse des Clients, richtig?
Georgios Pligoropoulos
Danke für die Antwort, die mich gerettet hat! Gibt es eine Möglichkeit, nginx so einzurichten, dass Post-Requests korrekt an uwsgi zurückgegeben werden, jedoch mit Sockets, anstatt uwsgi im http-Modus auszuführen?
Greg Jennings
@GregJennings Ein bisschen spät für eine Antwort, aber man würde die 'uwsgi_pass'-Direktive anstelle von' proxy_pass 'verwenden. Nur für den Fall, dass jemand anderes auf der Suche wandert ...
Kamilion
1
@ Will proxy_redirectnimmt zwei Argumente. Siehe die Dokumente: nginx.org/en/docs/http/…
Matthew Scharley