Jak skonfigurować blok lokalizacji, aby zawsze zwracał pojedynczy plik w Nginx?

12

W mojej aplikacji chcę, aby lokalizacja „/” zwróciła statyczny plik index.html, chcę, aby „/ static” obsługiwał pliki statyczne z folderu i chcę, aby wszystkie inne żądania zwróciły 404 NIE ZNALEZIONO. W późniejszym czasie zamierzam przekierować wszystkie pozostałe żądania do serwera WSGI.

To jest obecnie moja konfiguracja:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

Folder statyczny działa idealnie, ale „/” zwraca 404 NIE ZNALEZIONO. Próbowałem też:

alias /home/tomas/projects/streamcore/static/index_debug.html;

W bloku lokalizacji, ale zwraca 500 BŁĄD SERWERA WEWNĘTRZNEGO. Wygląda na to, aliasże nie lubi pojedynczych plików. Dodatkowo próbowałem:

try_files static/index_debug.html;

Ale to powstrzymuje serwer od rozpoczęcia błędu „nieprawidłowa liczba argumentów w dyrektywie try_files”. Najwyraźniej try_filesfaktycznie wymaga wypróbowania więcej niż jednego pliku, czego nie szukam.

Więc moje pytanie brzmi: w jaki sposób skonfigurować blok lokalizacji, aby zawsze zwracał plik statyczny?


EDYCJA: Widziałem z innych odpowiedzi, które aliasrzeczywiście powinny zaakceptować pojedynczy plik jako argument, więc spróbowałem:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

Ale nadal dostaję tylko 500 BŁĘDÓW SERWERA WEWNĘTRZNEGO. Dziennik błędów dla żądania „/” mówi:

[alert] 28112 # 0: * 7 „/home/tomas/projects/streamcore/static/index_debug.htmlindex.html” nie jest katalogiem

Dlaczego próbuje otworzyć plik „index_debug.htmlindex.html”? Nigdzie nie używam tej indexdyrektywy.

Hubro
źródło
Czy możesztry_files static/index_debug.html static/index_debug.html;
ceejayoz,
@ceejayoz: Wypróbowując twoją sugestię location =/, otrzymuję 404 NIE ZNALEZIONO, location /otrzymuję 500 BŁĄD SERWERA WEWNĘTRZNEGO.
Hubro,
Jeśli się nie mylę, brakuje Ci dyrektywy indeksowej ... Każdy serwer zawsze będzie szukał pliku indeksu, podając główny identyfikator URI (/), myślę, że możesz to zmienić, dodając:location / { return 404; }
Martino Dino
@MartinoDino: Dlaczego go potrzebuję? I gdzie?
Hubro,
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino,

Odpowiedzi:

10

Właśnie to przetestowałem i działa dla mnie:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

Plik /tmp/root/static/index_debug.htmlistnieje oczywiście :)

Mogę trafić dowolny adres URL i po prostu dostaję stronę statyczną.

chrskly
źródło
0

Możesz użyć try_files i przekierować do nazwanej lokalizacji z przepisem. Lubię to:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

Jeśli plik istnieje w /tmp/rootnim, zostanie podany, w przeciwnym razie zapisany zostanie plik URI static/index_debug.htmli zostanie on podany.

Kirill Zaitsev
źródło