Jak wykonać instrukcję if / else z nginx conf?

9

czy można zrobić coś takiego z nginx?

if ( $http_user_agent = "wget" ){
   server {
      listen      11.11.11.11:1111;
      root        /website1/;
      server_name example.com www.example.com;
else 

   server {
      listen      22.22.22.22:22222;
      root        /website2/;
      server_name example2.com www.example2.com;
}
użytkownik421936
źródło
Możesz rzucić okiem na moduł mapy .
gf_
2
Napisałeś coś dziwnego i zupełnie bez znaczenia. Spróbuj zacząć od początku, jaki problem chcesz rozwiązać
Alexey Ten

Odpowiedzi:

9

Moduł przepisywania Nginx ma ifdyrektywę (patrz przykłady w dokumentacji), ale nie ma else. Odpowiednikiem elsebyłoby wszystko, co nie jest modyfikowane za pomocąif .

Możesz używać ifwewnątrz, server { }ale nie na odwrót. Nie miałbyś nawet warunku porównanego w twoim przypadku, gdyby przed żądaniem, które już potrzebuje serwera. Tam możesz podawać zawartość tylko wtedy, gdy agent użytkownika jest (lub nie jest) wget.

Zauważ też, że nie powinieneś używać ifwewnątrz, locationponieważ może nie działać zgodnie z oczekiwaniami (zobacz Jeśli jest zły ).

Esa Jokinen
źródło
3

W podanej formie nie będzie działać: testowanie agenta użytkownika HTTP oznacza, że ​​żądanie zostało już odebrane. Jest to możliwe tylko wtedy, gdy jakiś serverblok został już zdefiniowany. Czy naprawdę chcesz uruchomić nowe serwery w zależności od ciągu User-Agent żądania otrzymanego w innym miejscu?

Jeśli chcesz po prostu udostępniać różne treści, przekierowywać do różnych ścieżek itp. W zależności od części żądania, takich jak User-Agent, jest to możliwe, np. Z http://nginx.org/en/docs/http/ngx_http_rewrite_module. HTML

Stefan Moch
źródło