it-swarm.com.de

NginX hinterer Schrägstrich in der Proxy-Pass-URL

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, dass URL https://example.com proxy die Anforderung an http://example.com:8080/? weiterleitet.

Anfragen (von einer mobilen App) fordern https://example.com// an, was nginx http://example.com:8080//? macht, was nicht funktioniert.

Dinge, die ich ausprobiert habe, die nicht funktioniert haben:

  • merge_slashes on; (der 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;
}
13
Pratyay Modi

Ich denke, Sie verwenden proxy_pass ohne URI. In diesem Fall übergeben nginx die ursprüngliche URI so, wie sie war, nicht die normalisierte. Sie sollten also proxy_pass http://backend/; verwenden.

UPDATE

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 in nginx-Dokumentation angegeben wenn proxy_pass ohne URI verwendet wird (d. H. Ohne Pfad nach Server: Port), wird nginx die URI aus der ursprünglichen Anforderung genauso setzen wie bei allen doppelten Schrägstrichen, ../ usw.

Auf der anderen Seite verhält sich der URI in proxy_pass wie die alias -Direktive. Das bedeutet, dass nginx ein Teil ersetzt, das mit dem Orts-Präfix übereinstimmt (in dem Fall, dass es /a an erster Stelle ist und /a/ an zweiter Stelle steht) mit URI in proxy_pass-Direktive (die ich absichtlich gemacht habe dasselbe wie Standort-Präfix), so dass die URI dieselbe ist wie angefordert, jedoch normalisiert (ohne Doule-Schrägstriche und all das Personal). Sei vorsichtig mit nachgestellten Schrägstrichen. Nginx ersetzt den Teil buchstäblich und es könnte zu einer seltsamen URL kommen.

Hier ist ein Beispiel mit nachgestelltem Schrägstrich in location, aber keinem nachlaufenden Schrägstrich in proxy_pass.

location /one/ {
    proxy_pass http://127.0.0.1:8080/two;
    ...
}

wenn Sie zur Adresse http://yourserver.com/one/path/here?param=1 gehen, wird nginx eine Proxy-Anfrage an http://127.0.0.1/twopath/here?param=1 senden. Sehen Sie, wie two und path verkettet werden.

19
Alexey Ten

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)

0
Dylan B