Nginx: wyrażenie regularne dla wielu ścieżek

30

Mam dwie lokalizacje w konfiguracji nginx, które działają:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

Jak połączyć te dwa w jedną lokalizację?

Co już zrobiłem:

Wypróbowałem tę sugestię

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

ale to nie działa dla mnie.

Ponadto, gdy nie używam backendów, następująca konfiguracja działa poprawnie:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

aktualizacja (niektóre ciągi z dziennika)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

ROZWIĄZANIE

Właściwie moje rozwiązanie działa dobrze:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

i problem nie ma nic wspólnego z backendami. Jak Guido Vaccarella poprawnie zauważył, po prostu następowało kolejne location ~ ..., pasujące, więc location ~ ...nie miałem szans na bieganie.

Vlad T.
źródło
Nie rozumiem, dlaczego przepustka proxy regex nie działa. Co się stanie, gdy spróbujesz?
Grumpy
Kiedy próbuję, frontend nginx zgłasza błąd 404.
Vlad T.
Czy) na końcu instrukcji lokalizacji jest tylko błędem w pytaniu, czy też znajduje się w pliku konfiguracyjnym?
Guido Vaccarella,
Powinieneś dokładnie sprawdzić resztę konfiguracji pod kątem błędów. Ponadto może chcieć dowiedzieć się, dlaczego rzuca 404, sprawdzając, gdzie szuka, czego brakuje. Możliwe jest również, że zgłasza błąd 404, gdy dokument błędu nie został znaleziony, i dlatego trzeba spojrzeć na wcześniej zgłoszony błąd.
Grumpy
proszę podać błąd z dziennika błędów
Mohammad AbuShady

Odpowiedzi:

30

Zgodnie z dokumentacją nginx :

Następnie sprawdzane są wyrażenia regularne w kolejności ich pojawienia się w pliku konfiguracyjnym. Wyszukiwanie wyrażeń regularnych kończy się przy pierwszym dopasowaniu i używana jest odpowiednia konfiguracja.

W twojej konfiguracji następująca lokalizacja jest zdefiniowana przed tą z proxy_pass i odpowiada żądaniu plików js i css pod statycznym :

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

Niestety klauzula „log_not_found off” wyłącza rejestrowanie błędów związanych z brakiem znalezienia pliku związanych z tą lokalizacją, dlatego Twój dziennik błędów jest pusty!

Możesz spróbować skomentować tę lokalizację lub przenieść ją za lokalizacją za pomocą proxy_pass (jeśli potrzebujesz go dla innych plików, które nie są w statycznym / medialnym ).

Guido Vaccarella
źródło
13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Powinno być...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

Zamknięciem musi być nawias klamrowy {}, a nie nawias klamrowy ().

Nie mogę uwierzyć, ile czasu to zajęło. Guido miał rację z komentarzy.

Gderliwy
źródło
Och, przepraszam za nieporozumienie, myślałem, że to oznaczało nawias po tym, jak „media” |media)w łańcuchu zaczynało się od „lokalizacji”. Ale zły nawias klamrowy to tylko literówka (poprawiona w pytaniu). W przeciwnym razie ta konfiguracja nginx nie zostałaby załadowana i ponownie wygenerowałaby błąd podobny do: unexpected ")"...Przepraszamy.
Vlad T.