Server proxy saya berjalan di ip A dan ini adalah cara orang mengakses layanan web saya. Konfigurasi nginx akan mengarahkan ulang ke mesin virtual di ip B.
Untuk server proxy pada IP A, saya memilikinya di situs saya-tersedia
server {
listen 443;
ssl on;
ssl_certificate nginx.pem;
ssl_certificate_key nginx.key;
client_max_body_size 200M;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
rewrite ^(.*) https://$http_host$1 permanent;
server_name localhost 127.0.0.1;
server_name_in_redirect off;
location / {
proxy_pass http://10.10.0.59:80;
proxy_redirect http://10.10.0.59:80/ /;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Itu proxy_redirect
diambil dari bagaimana saya mendapatkan nginx untuk meneruskan permintaan HTTP POST melalui penulisan ulang?
Segala sesuatu yang mengenai IP publik akan mencapai 443 karena penulisan ulang. Secara internal, kami meneruskan ke 80 pada mesin virtual.
Tetapi ketika saya menjalankan skrip python seperti yang di bawah ini untuk menguji konfigurasi kami
import requests
data = {'username': '....', 'password': '.....'}
url = 'http://IP_A/api/service/signup'
res = requests.post(url, data=data, verify=False)
print res
print res.json
print res.status_code
print res.headers
Saya mendapatkan 405 Method Not Allowed
. Di nginx kami menemukan bahwa ketika mengenai server internal, nginx internal mendapatkan GET
permintaan, meskipun di header asli kami melakukan POST
(ini ditunjukkan dalam skrip Python).
Jadi sepertinya menulis ulang memiliki masalah. Adakah yang tahu bagaimana cara memperbaikinya? Ketika saya berkomentar menulis ulang, pasti mencapai 80, dan sudah selesai. Karena menulis ulang dapat berbicara dengan server internal kami, jadi menulis ulang itu sendiri tidak memiliki masalah. Hanya saja penulisan ulang jatuh POST
ke GET
.
Terima kasih!
(Ini juga akan ditanyakan di forum Nginx karena ini adalah pemblokir kritis ...)
PUT
,POST
,DELETE
,GET
. Dalam pengaturan saya sebelumnya, saya tidak memiliki proksi tambahan ini di bagian depan yang melayani kerumunan. Saya memiliki konfigurasi yang sama pada server internal yang sama (server pengujian kami). Itu bekerja dengan baik.GET
. Tidak ada konfigurasi sisi server atau header http apa pun yang dikembalikan tidak akan mengubahnya. Itu seperti itu karena alasan historis (browser awal berperilaku seperti itu karena kesalahpahaman dan itu menjadi standar de facto).POST
akan menjadiGET
jika 301 atau 302 diarahkan. POST akan tetap POST pada redirect proxy, tetapi tidak pada penulisan ulang.If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.
Jadi sebagian besar browser akan memunculkan pesan peringatan, seperti untuk klien HTTP lain, saya bahkan tidak bisa menebak apa perilaku mereka.Saya menemukan
POST /api/brand
sedang berubah menjadiGET /api/brand
karena aplikasi web yang saya gunakan (flask-restful
) membuat permintaan "tidak valid". Jika saya menggunakanPOST /api/brand/
(perhatikan trailing/
), itu berhasil.sumber