Wie kann ich SetEnvIf verwenden, um eine Variable basierend auf dem HTTP-Host festzulegen?


11

Ich versuche, eine Variable für Apache festzulegen

ENV = DEV, wenn der http-Host die Entwickler-URL ist

oder

ENV = PRD, wenn der http-Host die prd-URL ist

und verwenden Sie dann $ _SERVER ['ENV'], um einige logische Zweige zu erstellen

Bisher hat keines davon für mich funktioniert und wir haben das setenvif-Modul installiert

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Was ist der richtige Weg, um dies zu tun?

Antworten:


15

Werfen Sie einen kurzen Blick auf die Dokumentation :

Die SetEnvIf-Direktive definiert Umgebungsvariablen basierend auf Attributen der Anforderung. Das im ersten Argument angegebene Attribut kann eines von drei Dingen sein:

Ein HTTP-Anforderungsheaderfeld (weitere Informationen hierzu finden Sie in RFC2616). Beispiel: Host, User-Agent, Referer und Accept-Language. Ein regulärer Ausdruck kann verwendet werden, um einen Satz von Anforderungsheadern anzugeben.

Es ist also durchaus möglich, eine Umgebungsvariable vom HostHeader abhängig zu machen . Es sieht so aus, als würden Sie versuchen, entweder den Refereroder den Remote_HostHeader zu verwenden, von denen keiner genau das ist, was Sie wollen (obwohl theoretisch in den meisten Fällen Refererder Wert des HostHeaders enthalten sein sollte ). Remote_HostDies ist der Hostname des Clients , der die Anforderung stellt, was überhaupt nicht Ihren Wünschen entspricht (und in den meisten Konfigurationen einfach nicht verfügbar ist, da DNS-Suchvorgänge aus Leistungsgründen normalerweise deaktiviert sind).

Versuchen Sie so etwas:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... und verwenden Sie dann $ _SERVER ['ENV'], um einige logische Zweige zu erstellen

Beachten Sie jedoch auch, dass Sie den Wert des HostHeaders einfach direkt in PHP referenzieren können, ohne diese Schikanen durchzugehen. $_SERVER['HTTP_HOST']wird genau das haben, was Sie wollen.


Schön. Auf diese Weise kann ich benutzerdefinierte Regeln schreiben, die Kennwörter erfordern, wenn eine Verbindung zu bestimmten Hosts hergestellt wird, jedoch nicht zu anderen (dh die Staging-Box schützen, wenn eine VM auf mehrere Amazon EC2-Instanzen geklont wird, aber keine benutzerdefinierten Chef-Rezepte schreiben). Sehr nützliche, wenn auch schwer zu suchende Funktionalität.
Eric L.

1
Die SetEnvIfDokumente sagen, dass der 3. Parameter ein regulärer Ausdruck ist. Sollten die Punkte im Domainnamen nicht mit einem Backslash maskiert werden? Oder wird Apache durch Anführungszeichen in doppelten Anführungszeichen als Zeichenfolgenliteral behandelt?
Jakub.g

@ jakub.g Ja, sie sind eine Regex und sollten entkommen. In diesem Fall stimmt ein "www-dev.example.com"regulärer Ausdruck auch mit unerwarteten Hostnamen überein , da ein Punkt mit einem einzelnen Zeichen übereinstimmt, z www-dev-example.com. Sie erhalten die erwarteten Übereinstimmungen und mehr. Ich habe das Beispiel jetzt aktualisiert.
Martijn Heemels
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.