comment obtenir nginx pour transférer des requêtes HTTP POST via réécriture?

19

Mon application iOS accède actuellement au domaine A via http POST, mais je souhaite transmettre toutes les demandes au domaine B.

Si j'utilise l'habituel, rewrite ^/(.*)$ http://mydomain/$1 permanent;les données POST semblent se perdre.

Comment puis-je transmettre des données HTTP POST à ​​un autre domaine à l'aide de NginX?

Jiho Kang
la source

Réponses:

32

Essayez plutôt d' utiliser la prise en charge du proxy inverse . Un exemple de locationsection serait:

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

Cet exemple transmettra toutes les demandes à ce serverbloc à un deuxième serveur en cours d'exécution localhost:8080. Cela préserve POSTles et devrait également conserver d'autres types de demandes si cela devient un problème.

Le problème est que les redirections externes ne renverront jamais dePOST données. Ceci est écrit dans la spécification HTTP (consultez la section 3xx). Tout client qui fait cela viole les spécifications.

Si le code d'état 301/302 est reçu en réponse à une demande autre que GET ou HEAD, l'agent utilisateur NE DOIT PAS rediriger automatiquement la demande sauf si elle peut être confirmée par l'utilisateur, car cela pourrait changer les conditions dans lesquelles la demande a été émise .

Je suis assez sûr que la plupart des navigateurs implémentent cela en forçant simplement la demande redirigée à être une GETdemande. Théoriquement, la spécification autorise un navigateur qui demanderait à l'utilisateur de rediriger les POSTdonnées, mais je n'en connais pas actuellement.

Matthew Scharley
la source
impressionnant! fonctionne comme un charme
Jiho Kang
un peu confus du commentaire. Dois-je généralement définir les proxy_set_headervaleurs? Sinon, je suppose que l'adresse distante devient l'adresse distante du serveur proxy, mais ce que je veux habituellement, c'est l'adresse distante du client, n'est-ce pas?
Georgios Pligoropoulos
Merci pour la réponse qui m'a sauvé! Existe-t-il un moyen de configurer nginx pour qu'il transmette correctement les demandes de publication à uwsgi mais avec des sockets au lieu d'exécuter uwsgi en mode http?
Greg Jennings
@GregJennings Un peu tard pour une réponse, mais on utiliserait la directive 'uwsgi_pass' au lieu de 'proxy_pass'. Juste au cas où quelqu'un d'autre se promène en regardant ...
Kamilion
1
@Will proxy_redirectprend deux arguments. Voir les documents: nginx.org/en/docs/http/…
Matthew Scharley