Jak mogę użyć SetEnvIf, aby ustawić zmienną na podstawie hosta HTTP?

11

Próbuję ustawić zmienną na Apache

ENV = DEV, jeśli host http to dev URL

lub

ENV = PRD, jeśli host http to prd URL

a następnie użyj $ _SERVER ['ENV'], aby utworzyć niektóre gałęzie logiczne

Jak dotąd żaden z nich nie działał dla mnie i mamy zainstalowany moduł setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Jak to zrobić?

qodeninja
źródło

Odpowiedzi:

15

Rzut oka na dokumentację :

Dyrektywa SetEnvIf definiuje zmienne środowiskowe na podstawie atrybutów żądania. Atrybut określony w pierwszym argumencie może być jedną z trzech rzeczy:

Pole nagłówka żądania HTTP (więcej informacji na ten temat można znaleźć w RFC2616); na przykład: Host, User-Agent, Referer i Accept-Language. Do określenia zestawu nagłówków żądania można użyć wyrażenia regularnego.

Tak więc z pewnością możliwe jest uzależnienie zmiennej środowiskowej od Hostnagłówka. Wygląda na to, że próbujesz użyć nagłówka Refererlub Remote_Host, ale żaden z nich nie jest dokładnie tym, czego chcesz (chociaż teoretycznie w większości przypadków Refererpowinien zawierać wartość Hostnagłówka). Remote_Hostbędzie nazwą hosta klienta wysyłającego żądanie, co wcale nie jest tym, czego chcesz (aw większości konfiguracji po prostu nie byłoby dostępne, ponieważ typowe jest wyłączenie wyszukiwania DNS ze względu na wydajność).

Wypróbuj coś takiego:

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

... a następnie użyj $ _SERVER ['ENV'], aby utworzyć gałęzie logiczne

Pamiętaj jednak, że możesz po prostu odwoływać się do wartości Hostnagłówka bezpośrednio w PHP bez przechodzenia przez ten szykany; $_SERVER['HTTP_HOST']będzie miał dokładnie to, czego chcesz.

Larsks
źródło
Piękny. Pozwoliło mi to napisać niestandardowe reguły wymagające haseł podczas łączenia się z niektórymi hostami, ale nie innymi (tj. Chroń pole przejściowe, gdy jedna maszyna wirtualna zostanie sklonowana na wiele instancji Amazon EC2, ale nie pisz niestandardowych przepisów szefa kuchni). Bardzo przydatna, choć trudna do wyszukania, funkcjonalność.
Eric L.,
1
Dokumenty SetEnvIfmówią, że trzeci parametr jest wyrażeniem regularnym, czy kropki w nazwie domeny nie powinny być poprzedzane odwrotnym ukośnikiem? Czy też cytowanie wartości w podwójnych cudzysłowach powoduje, że Apache traktuje ją jako dosłowny ciąg?
jakub.g
@ jakub.g Tak, są wyrażeniem regularnym i należy ich unikać. W takim przypadku, ponieważ kropka pasuje do dowolnego pojedynczego znaku, "www-dev.example.com"wyrażenie regularne dopasuje również nieoczekiwane nazwy hosta, takie jak www-dev-example.com. Dostaniesz oczekiwane mecze i więcej. Zaktualizowałem teraz przykład.
Martijn Heemels,