jak mogę zmusić nginx do przesyłania dalej żądań HTTP POST poprzez przepisanie?

19

Moja aplikacja na iOS obecnie uzyskuje dostęp do domeny A za pośrednictwem protokołu HTTP POST, ale chciałbym przekazać wszystkie żądania do domeny B.

Jeśli użyję zwykłych rewrite ^/(.*)$ http://mydomain/$1 permanent;danych, POST wydaje się zgubić.

Jak mogę przekazać dane HTTP POST do innej domeny za pomocą NginX?

Jiho Kang
źródło

Odpowiedzi:

32

Zamiast tego spróbuj użyć obsługi odwrotnego proxy . Przykładowa locationsekcja to:

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

Ten przykład przekaże wszystkie żądania do tego serverbloku do drugiego serwera, na którym działa localhost:8080. To zachowuje POSTi powinno również zachować inne typy żądań, jeśli kiedykolwiek stanie się to problemem.

Problem polega na tym, że zewnętrzne przekierowania nigdy nie będą ponownie wysyłać POSTdanych. Jest to zapisane w specyfikacji HTTP (sprawdź sekcję 3xx). Każdy klient, który to zrobi, narusza specyfikację.

Jeśli kod stanu 301/302 zostanie odebrany w odpowiedzi na żądanie inne niż GET lub HEAD, agent użytkownika NIE MOŻE automatycznie przekierować żądania, chyba że może to zostać potwierdzone przez użytkownika, ponieważ może to zmienić warunki, w których żądanie zostało wydane .

Jestem całkiem pewien, że większość przeglądarek implementuje to, po prostu zmuszając przekierowane żądanie do GETżądania. Teoretycznie specyfikacja zezwala na przeglądarkę, która zapyta użytkownika, czy należy przekierować POSTdane, ale nie jestem świadomy żadnego z tych działań.

Matthew Scharley
źródło
super! działa jak urok
Jiho Kang,
trochę zdezorientowany komentarzem. Czy ogólnie chcę ustawić proxy_set_headerwartości? W przeciwnym razie zdaje się, że zdalny adres staje się zdalnym adresem serwera proxy, ale to, czego zwykle chcę, to zdalny adres klienta, prawda?
Georgios Pligoropoulos
Dzięki za odpowiedź, która mnie uratowała! Czy istnieje sposób na skonfigurowanie nginx, aby poprawnie przekazywał żądania wysyłania z powrotem do uwsgi, ale z gniazdami zamiast uruchamiania uwsgi w trybie http?
Greg Jennings,
@GregJennings Trochę za późno na odpowiedź, ale zamiast „proxy_pass” można by zastosować dyrektywę „uwsgi_pass”. Na wypadek, gdyby ktoś wędrował, szukając ...
Kamilion
1
@Will proxy_redirectprzyjmuje dwa argumenty. Zobacz dokumentację: nginx.org/en/docs/http/…
Matthew Scharley