Ich weiß, dass diese Frage mehrmals gestellt wurde, aber nachdem ich viele Lösungen ausprobiert habe, bin ich immer noch fest.
Ich benutze NginX, um eine NodeJs-Anwendung zu übergeben. Ich versuche, URL zu machen https://example.com
Proxy die Anfrage an übergeben http://example.com:8080/?
Anfragen (von einer mobilen App) werden angefordert https://example.com//
was nginx macht http://example.com:8080//?
was nicht funktioniert.
Dinge, die ich ausprobiert habe, haben nicht funktioniert:
merge_slashes on;
(die standardmäßig aktiviert ist)rewrite ^/(.*)/$ /$1 permanent;
port_in_redirect off;
Meine nginx config:
location = /a {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300;
}
location ^~ /a/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300;
}
Antworten:
12 für die Antwort № 1Ich denke, Sie verwenden proxy_pass ohne URI. In diesem Fall übergeben nginx die ursprüngliche URI so, wie sie war, nicht die normalisierte. Also solltest du verwenden proxy_pass http://backend/;
AKTUALISIEREN
Also hatte ich recht. Fügen Sie einfach den URI-Teil zu proxy_pass hinzu:
location = /a {
proxy_pass http://127.0.0.1:8080/a;
...
}
location ^~ /a/ {
proxy_pass http://127.0.0.1:8080/a/;
...
}
Wie angegeben in Nginx-Dokumentation ob proxy_pass
Wird ohne URI (d. h. ohne Pfad nach Server: Port) verwendet. nginx setzt die URI aus der ursprünglichen Anforderung genauso wie bei allen doppelten Schrägstrichen ../
und so weiter.
Auf der anderen Seite URI in proxy_pass
verhält sich wie alias
Direktive, bedeutet, dass Nginx ein Teil ersetzt, das mit dem Standort - Präfix übereinstimmt (in diesem Fall "s") /a
in erster lage und /a/
ist zweitens) mit URI in proxy_pass
Direktive (die ich absichtlich als Standortpräfix verwendet habe), so dass die URI dieselbe ist wie gewünscht, aber normalisiert (ohne Doule-Slashes und all das Personal). Achtung mit nachlaufenden Schrägstrichen. Nginx ersetzt den Teil buchstäblich und es könnte zu einer seltsamen URL kommen.
Hier ist ein Beispiel mit nachfolgendem Schrägstrich location
, aber kein Nachhinein proxy_pass
.
location /one/ {
proxy_pass http://127.0.0.1:8080/two;
...
}
wenn man an Adresse geht http://yourserver.com/one/path/here?param=1
nginx wird eine Proxy-Anfrage an http://127.0.0.1/twopath/here?param=1
. Siehe wie two
und path
verkettet.
0 für die Antwort № 2
Sie könnten diese Zeilen hinzufügen:
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Beispiel: Ich übergebe den öffentlichen Port 80 an den lokalen Port 880
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 32 8k;
proxy_busy_buffers_size 64k;
proxy_pass http://127.0.0.1:880/;
}
Hinweis: Stellen Sie sicher, dass Sie Nginx neu starten. Sie müssen möglicherweise einen anderen Browser verwenden, um die neue Konfiguration zu testen (Cache vermeiden).