/ / NginX hinterer Schrägstrich im Proxy-Durchlauf URL - Nginx, Proxy, Proxypass

NginX abschließender Schrägstrich in der Proxy-Pass-URL - nginx, proxy, proxypass

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 № 1

Ich 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).