web-dev-qa-db-fra.com

comment puis-je obtenir nginx pour transmettre HTTP POST requêtes via réécriture?

Mon application iOS accède actuellement au domaine A via http POST mais je voudrais transférer toutes les demandes vers le domaine B.

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

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

21
Jiho Kang

Essayez plutôt d'utiliser le support du proxy inverse . Un exemple de section location 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 bloc server à un deuxième serveur exécuté sur localhost:8080. Cela préserve les POST et devrait également conserver d'autres types de requêtes si cela devient un problème.

Le problème est que les redirections externes ne renverront jamais les données POST. Ceci est écrit dans la spécification HTTP (vérifiez 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 demande GET. Théoriquement, la spécification autorise un navigateur qui demanderait à l'utilisateur de rediriger les données POST, mais je n'en connais pas qui le font actuellement.

33
Matthew Scharley