
Wie kann ich für einen Besucherhost festlegen, dass er einen bestimmten Stammpfad in Nginx verwendet?
Besucher mit IP 1.1.1.1 verwenden
root /srv/web1
alle anderen Besucher nutzen
root /srv/web2
Antwort1
Diese Frage lässt sich leicht beantworten, indem man ein wenig recherchiert und die Dokumentation liest (vorzugsweise beginnend mit demRatgeber für Anfängerund dannWie nginx eine Anfrage verarbeitet), ich werde es trotzdem beantworten.
Ich gehe davon aus, dass Sie einen Server mit mehr als einer Netzwerkschnittstelle und IP-Adresse haben, wobei die Adresse 1.1.1.1 einer Schnittstelle und die anderen Adressen den jeweiligen Schnittstellen zugewiesen sind.
Nginx ist in dieser Hinsicht sehr flexibel. Tatsächlich gibt es immer einen server
Block, der als Standard verwendet wird, wenn Nginx keinen anderen Serverblock finden kann server_name
: entweder der erste server
Block der Datei oder der, der default_server
in der listen
Direktive angegeben ist. Und denken Sie daran:listen
Sie können in der Direktive eine IP angeben.
Das bedeutet in Ihrem Fall:
server {
listen 80 default_server;
root /srv/web2;
[...]
}
server {
listen 1.1.1.1:80;
root /srv/web1;
[...]
}
Wie Sie im obigen Beispiel sehen können, server
lauscht der erste Block auf allen Schnittstellen auf Port 80, während der zweite Block nur auf der Schnittstelle 1.1.1.1 auf Port 80 lauscht. Daher erhält jeder, der Ihre Site über die Netzwerkschnittstelle 1.1.1.1 besucht, Dateien von /srv/web1, unabhängig vom Hostfeld in der HTTP-Anforderung (d. h. dem Domänennamen, der in der URL-Leiste steht).
Ein ähnliches Verhalten lässt sich erreichen, indem man die IP-Adresse server_name
wie folgt in die Direktive einfügt:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* Beachten Sie, dass dieser letzte server
Block nur Anfragen an die wörtliche IP-Adresse und nicht an Domänennamen abfängt.
Ich hoffe, dies beantwortet Ihre Frage. Geben Sie beim nächsten Mal jedoch bitte zusätzliche Informationen zu Ihrer aktuellen Konfiguration an und recherchieren Sie ein wenig.
Aktualisieren
Um das beschriebene Verhalten zu erreichen, können Sie denGeodatenModulwie indiese Frage:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
Diese Konfiguration verwendet dieGeodatenModul, um eine Variable ( $client
) basierend auf der IP-Adresse des Clients zu setzen. Diese Variable wird entweder auf den Standardwertweb2oder die spezifischeWebseiteund wird dann in der Richtlinie ersetzt root
.
Beachten Sie, dass sich die geo
Direktive innerhalb des http
Blocks und nicht server
in Blöcken befinden muss. Der obige Codeausschnitt sollte so funktionieren, wie er ist, aber ich übernehme keine Garantie, da ich ihn nicht getestet habe.