Mein Proxy-Server läuft auf IP A und so greifen die Leute auf meinen Webdienst zu. Die Nginx-Konfiguration wird auf eine virtuelle Maschine auf IP B umgeleitet.
Für den Proxyserver auf IP A habe ich diesen in meinen Sites zur Verfügung gestellt
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;
}
}
Das proxy_redirect
wurde aus genommen wie bekomme ich Nginx HTTP POST - Anfragen über Rewrite weiterleiten?
Alles, was die öffentliche IP trifft, wird wegen des Umschreibens 443 treffen. Intern leiten wir auf der virtuellen Maschine auf 80 weiter.
Aber wenn ich ein Python-Skript wie das folgende ausführe, um unsere Konfiguration zu testen
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
Ich bekomme eine 405 Method Not Allowed
. In nginx stellten wir fest, dass der interne Nginx beim Aufrufen des internen Servers eine GET
Anfrage erhielt, obwohl wir im ursprünglichen Header eine Anfrage gestellt hatten POST
(dies wurde im Python-Skript angezeigt).
Es scheint also, als hätte das Umschreiben ein Problem. Irgendeine Idee, wie man das behebt? Als ich die Umschreibung auskommentierte, traf sie mit Sicherheit 80 und ging durch. Da rewrite mit unserem internen Server kommunizieren konnte, ist rewrite selbst kein Problem. Es ist nur die Umschreibung, POST
auf die verwiesen wird GET
.
Vielen Dank!
(Dies wird auch im Nginx-Forum gefragt, da dies ein kritischer Blocker ist ...)
PUT
,POST
,DELETE
,GET
. In meinem vorherigen Setup hatte ich keinen zusätzlichen Proxy an der Front, der der Menge diente. Ich hatte dieselbe Konfiguration auf demselben internen Server (unserem Testserver). Das funktioniert gut.GET
. Keine serverseitige Konfiguration oder zurückgegebene HTTP-Header ändern dies nicht. Es ist aus historischen Gründen so (frühe Browser verhielten sich aufgrund von Missverständnissen so und es wurde ein De-facto-Standard).POST
wird es,GET
wenn es 301 oder 302 umgeleitet wird. POST bleibt POST bei der Proxy-Umleitung, jedoch nicht beim Umschreiben.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.
Die meisten Browser werden also eine Warnmeldung anzeigen, da ich für andere HTTP-Clients nicht einmal erraten kann, wie sie sich verhalten werden.Ich habe festgestellt,
POST /api/brand
dass in verwandelt wurde,GET /api/brand
weil die von mir verwendete Webanwendung (flask-restful
) eine "ungültige" Anfrage gestellt hat. Wenn ich es benutzt habePOST /api/brand/
(beachte das Nachziehen/
), war es erfolgreich.quelle