Nginx unerwünschte Standortumleitung mit nachfolgendem Schrägstrich

8

Ich habe einen Ort

location /pass/ {
    proxy_pass http://localhost:12345/;
}

Es soll also URLs http://example.com/pass/whateverzu proxifizierenhttp://localhost:12345/whatever

Das, was ich nicht mag, ist, dass Nginx automatisch einen Schrägstrich hinzufügt

http://example.com/pass

und macht es http://example.com/pass/über 301 umleiten

Wie kann ich dieses Verhalten einfach vermeiden? Ich möchte /passohne nachgestellten Schrägstrich an einen anderen Ort gehen. Danke im Voraus!

igor
quelle
Ich habe es mit Regex ( /pass/(.*)... /$1$is_args$args) gelöst , andere Lösungen wären
willkommen
Nur für den Fall, dass es anderen hilft, 301 Weiterleitungen von ihren Nginx-Proxy-Webapps in Frage zu stellen, stellen Sie sicher, dass es nicht die Webapp ist, die dies tut. Das war in meinem Fall die Ursache, nicht Nginx.
Jacob Wan

Antworten:

2

Da es an einen anderen Ort verschoben werden soll , besteht eine natürliche Lösung darin, diesen Ort hinzuzufügen

location /pass {
}

Standardmäßig sucht nginx im Webstamm nach einer Datei mit dem Namen "pass". Wenn Ihnen diese Standardeinstellung nicht gefällt, können Sie weitere Anweisungen in diesen neuen Standortblock einfügen, um dies zu erreichen.

Sie können auch verwenden

location = /pass {
}

so dass nginx die Übereinstimmung etwas schneller finden kann.

Chuan Ma
quelle
Ja, dies ist eine Lösung, aber in einigen Fällen kann die Konfiguration aufgebläht werden (
igor
2

Es gibt einen Sonderfall, in dem ein proxy_passmit einem locationEnde in /zu einer automatischen impliziten 301Umleitung führen würde, ohne zum Backend zu wechseln. Sie müssen einen expliziten locationSchrägstrich ohne den abschließenden Schrägstrich erstellen , um dies zu vermeiden:

Wenn ein Speicherort durch eine Präfixzeichenfolge definiert ist, die mit dem Schrägstrich endet, und Anforderungen von proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass oder grpc_pass verarbeitet werden, wird die spezielle Verarbeitung ausgeführt. In Antwort auf eine Anforderung mit einem URI, der dieser Zeichenfolge entspricht, jedoch ohne den abschließenden Schrägstrich, wird eine permanente Umleitung mit dem Code 301 an den angeforderten URI mit dem angehängten Schrägstrich zurückgegeben. Wenn dies nicht erwünscht ist, kann eine genaue Übereinstimmung von URI und Speicherort wie folgt definiert werden:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

ZB müssen Sie /pass locationzusätzlich zu dem vorhandenen ein explizites erstellen /pass/, andernfalls wird ein implizites location /pass {return 301 /pass/…;}für Sie erstellt.

Sind Sie jedoch sicher, dass Sie tatsächlich das tun möchten, was Sie versuchen? Wenn Sie eine Umleitung von wegzulassen gehst /passzu /pass/, dann relative Pfade gehen nicht zur Arbeit. Einige neuere Browser neigen auch dazu, fehlerhafte UI / UX-Funktionen zu verwenden, die dem Benutzer möglicherweise nicht den abschließenden Schrägstrich anzeigen, was die Dinge noch verwirrender machen kann, wenn versucht wird, die Unterscheidung zu beheben.

cnst
quelle
1
der Punkt ist , dass Lage /pass/zwingt Umleitung für /passsie anzupassen, solange ich denken, /passsollte besser passen Lage /und nicht/pass/
igor
9
@cnst: Eigentlich wird es, und es ist dokumentiert, dass es das tut. Siehe den letzten Absatz von nginx.org/en/docs/http/ngx_http_core_module.html#location . Wenn Sie an einem Ort mit einem abschließenden Schrägstrich Proxy_pass, Fastcgi_pass, Uwsgi_pass, scgi_pass oder memcached_pass einfügen, wird das Flag "auto_redirect" für den Ort gesetzt, wodurch die Umleitung in dieser Zeile ausgelöst wird
Bazzargh