bagaimana cara mendapatkan nginx untuk meneruskan permintaan HTTP POST melalui penulisan ulang?

19

Aplikasi iOS saya saat ini sedang mengakses domain A melalui http POST tetapi saya ingin meneruskan semua permintaan ke domain B.

Jika saya menggunakan yang biasa rewrite ^/(.*)$ http://mydomain/$1 permanent;, data POST sepertinya hilang.

Bagaimana saya bisa meneruskan data HTTP POST ke domain lain menggunakan NginX?

Jiho Kang
sumber

Jawaban:

32

Coba gunakan dukungan proxy terbalik . Bagian contohnya locationadalah:

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

Contoh ini akan melewati semua permintaan ke serverblok ini ke server kedua yang berjalan localhost:8080. Ini menyimpan POSTdan juga harus melestarikan jenis permintaan lainnya juga jika itu menjadi masalah.

Masalahnya adalah bahwa pengalihan eksternal tidak akan pernah mengirim ulang POSTdata. Ini ditulis ke dalam spec HTTP (periksa bagian 3xx). Setiap klien yang melakukan ini melanggar spesifikasi.

Jika kode status 301/302 diterima sebagai tanggapan terhadap permintaan selain GET atau HEAD, agen pengguna TIDAK HARUS secara otomatis mengarahkan kembali permintaan kecuali dapat dikonfirmasi oleh pengguna, karena ini dapat mengubah kondisi di mana permintaan dikeluarkan. .

Saya cukup yakin bahwa sebagian besar browser menerapkan ini hanya dengan memaksa permintaan yang dialihkan menjadi GETpermintaan. Secara teoritis, spesifikasi memang memungkinkan untuk browser yang akan meminta pengguna apakah akan mengarahkan ulang POSTdata, tapi saya tidak mengetahui apa pun yang saat ini dilakukan.

Matthew Scharley
sumber
awsome! bekerja seperti pesona
Jiho Kang
sedikit bingung dari komentar. Apakah saya umumnya ingin menetapkan proxy_set_headernilai? Kalau tidak, saya kira alamat jarak jauh menjadi alamat jarak jauh dari server proxy, tetapi yang biasanya saya inginkan adalah alamat jarak jauh klien, benar?
Georgios Pligoropoulos
Terima kasih atas jawaban yang menyelamatkan saya! Apakah ada cara untuk mengatur nginx sehingga dapat mengirimkan permintaan posting dengan benar kembali ke uwsgi tetapi dengan soket alih-alih menjalankan uwsgi dalam mode http?
Greg Jennings
@GregJennings Agak terlambat untuk menjawab, tetapi orang akan menggunakan arahan 'uwsgi_pass' alih-alih 'proxy_pass'. Untuk berjaga-jaga jika ada orang yang berkeliaran dengan melihat ...
Kamilion
1
@Akan proxy_redirectmengambil dua argumen. Lihat dokumen: nginx.org/en/docs/http/…
Matthew Scharley