W tej chwili konfiguruję obsługę niektórych stron błędów i innych „domyślnych” plików multimedialnych (takich jak favicon.ico i robots.txt) przez nginx i napotkałem drobny problem z działaniem tak, jak chcę, dla niektórych stron błędów .
Zasadniczo to, co próbuję zrobić, to podać pewne pliki dla serwera w katalogu głównym dla tego serwera, np. /Var/www/someserver.com/robots.txt. Jeśli ten plik nie istnieje, chcę, aby nginx przeszedł do „domyślnej”, tj. /Var/www/default/robots.txt. Oto podstawowa informacja o tym, jak skonfigurowałem (pomyślnie):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
To działa świetnie.
Próbuję zrobić to samo dla stron błędów, ale nie jestem w stanie tego zrobić:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Zauważ, że to „działa” w tym sensie, że jeśli odwiedzasz someserver.com/404.html, najpierw spróbuje załadować /var/www/someserver.com/404.html, a następnie wróci do / var / www / default /404.html, jeśli nie zostanie znaleziony. Jeśli jednak odwiedzisz someserver.com/blahblah, wyświetli stronę 404 tylko wtedy, gdy jest ustawiona w /var/www/someserver.com/. Nie wraca do domyślnego katalogu, jeśli ten plik nie istnieje.
W każdym razie możesz prawdopodobnie to, co próbowałem osiągnąć (dlatego podałem pierwszy działający przykład).
Jakieś pomysły?
Edytować:
Na podstawie odpowiedzi Martina F. skończyłem razem:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
To działa świetnie. Rzeczywisty blok powyższych stron błędów i lokalizacji znajduje się w pliku server_defaults.conf, który jest dołączany do każdego wirtualnego hosta, dlatego nie zapisałem na stałe ścieżki do każdej lokalizacji i użyłem ścieżki względnej dla wartości domyślnych.
Edycja 2:
Takie podejście ma problem. Jeśli wykonasz test POST pod adresem URL, który zwraca błąd, metoda żądania POST zostanie wysłana przy próbach try_files. To (dla mnie) powoduje błąd 405 niedozwolony, ponieważ nginx zasadniczo próbuje POST np. Do /default/500.html zamiast po prostu pobrać tę stronę.
Edycja 3:
Opublikowałem rozwiązanie, które działa znacznie bliżej mojego oryginalnego pomysłu.
log_not_found off;
i dodaćinternal;
.Try_files to sposób, aby przejść tutaj. Poniższa konfiguracja powinna działać, ale nie przetestowałem jej pod kątem błędów składniowych.
źródło
Niestety spóźniłem się z odpowiedzią kilka lat, ale pomyślałem, że może to pomóc przyszłym poszukiwaczom. Moja zainstalowana wersja Nginx to 1.2.4 i utworzyłem następujący fragment konfiguracji,
źródło
internal
.Zauważyłem, że zasadnicze znaczenie miało włączenie „proxy_intercept_errors on;” w dowolnym bloku lokalizacji, w którym uwzględniono również stronę_błędu.
Bez tego ustawienia blok lokalizacji będzie przechwytywał kody błędów wracające z góry.
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
źródło