Come configuro un blocco di posizione per restituire sempre un singolo file in nginx?


12

Nella mia applicazione voglio che la posizione "/" restituisca un file index.html statico, voglio che "/ static" serva i file statici da una cartella e voglio che tutte le altre richieste restituiscano 404 NOT FOUND. In un secondo momento reindirizzerò tutte le altre richieste a un server WSGI.

Questa è attualmente la mia configurazione:

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

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

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

La cartella statica funziona perfettamente, ma "/" restituisce 404 NON TROVATO. Ho anche provato:

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

Nel blocco posizione, ma restituisce 500 ERRORE SERVER INTERNO. Sembra aliasche non piacciano i singoli file. Inoltre ho provato:

try_files static/index_debug.html;

Ma ciò impedisce al server di iniziare con l'errore "numero di argomenti non valido nella direttiva try_files". Apparentemente in try_filesrealtà ti richiede di provare più di un file, che non è il comportamento che sto cercando.

Quindi la mia domanda è: come configuro un blocco di posizione per restituire sempre un file statico?


EDIT: Ho visto da altre risposte che aliasdovrebbero effettivamente accettare un singolo file come argomento, quindi ho provato:

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

Ma ho ancora solo 500 ERRORI DEL SERVER INTERNO. Il registro degli errori per la richiesta "/" indica:

[alert] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" non è una directory

Perché sta provando ad aprire "index_debug.htmlindex.html"? Non sto usando la indexdirettiva da nessuna parte.


Puoitry_files static/index_debug.html static/index_debug.html;
ceejayoz,

@ceejayoz: provando il tuo suggerimento con location =/ottengo 404 NON TROVATO, con location /ottengo 500 ERRORE SERVER INTERNO.
Hubro,

Se non sbaglio, manchi la direttiva Index ... Qualsiasi server web cercherà sempre il file indice, fornendo l'URI di root (/), penso che puoi ignorarlo aggiungendo:location / { return 404; }
Martino Dino

@MartinoDino: Perché ne ho bisogno? E dove?
Hubro,

location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino,

Risposte:


10

Ho appena provato questo e funziona per me:

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

Il file /tmp/root/static/index_debug.htmlesiste ovviamente :)

Posso colpire qualsiasi URL e ottengo solo la pagina statica.


0

È possibile utilizzare try_files e un reindirizzamento a una posizione denominata con riscrittura. Come questo:

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

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

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

Se il file esiste /tmp/root, verrà servito, altrimenti verrà riscritto uri static/index_debug.htmle verrà servito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.