Ich habe einen Standort
location /pass/ {
proxy_pass http://localhost:12345/;
}
Es soll also URLs weiterleiten http://example.com/pass/whatever
anhttp://localhost:12345/whatever
Was mir nicht gefällt, ist, dass nginx automatisch Schrägstriche anfügt
http://example.com/pass
und macht es http://example.com/pass/
per 301-Weiterleitung
Wie kann ich dieses Verhalten einfach vermeiden. Ich möchte /pass
ohne abschließenden Schrägstrich an eine andere Stelle gelangen. Vielen Dank im Voraus!
Antwort1
Es gibt einen Sonderfall, bei dem ein proxy_pass
mit der location
Endung „in“ /
zu einer automatischen impliziten Weiterleitung ohne Umleitung zum Backend führen würde 301
. Um dies zu vermeiden, müssen Sie eine explizite Weiterleitung location
ohne abschließenden Schrägstrich erstellen:
Wenn ein Standort durch eine Präfixzeichenfolge definiert ist, die mit einem Schrägstrich endet, und Anforderungen von einem der folgenden Verfahren verarbeitet werden: proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass oder grpc_pass, wird die spezielle Verarbeitung ausgeführt. Als Antwort auf eine Anforderung mit einer URI, die dieser Zeichenfolge entspricht, jedoch ohne den abschließenden Schrägstrich, wird eine permanente Umleitung mit dem Code 301 an die angeforderte URI mit angehängtem Schrägstrich zurückgegeben. Wenn dies nicht gewünscht ist, kann eine genaue Übereinstimmung von URI und Standort wie folgt definiert werden:
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
Beispielsweise müssen Sie /pass
location
zusätzlich zu dem vorhandenen ein explizites erstellen /pass/
, andernfalls location /pass {return 301 /pass/…;}
wird ein implizites für Sie erstellt.
Sind Sie jedoch sicher, dass Sie das, was Sie versuchen, wirklich tun möchten? Wenn Sie eine Umleitung von /pass
nach weglassen /pass/
, funktionieren relative Pfade nicht. Einige neuere Browser neigen auch dazu, fehlerhafte UI/UX aufzuweisen, die dem Benutzer möglicherweise den abschließenden Schrägstrich nicht anzeigen, was die Dinge beim Versuch, den Unterschied zu beheben, noch verwirrender machen kann.
Antwort2
Wie Sie möchten, dass es gehtein anderer Ort, ist eine natürliche Lösung, diesen Standort hinzuzufügen
location /pass {
}
Standardmäßig sucht nginx im Webstamm nach einer Datei namens „pass“. Wenn Ihnen diese Vorgabe nicht gefällt, können Sie in diesem neuen Standortblock weitere Anweisungen hinzufügen, um dies zu erreichen.
Sie können auch verwenden
location = /pass {
}
sodass Nginx die Übereinstimmung etwas schneller finden kann.