Como configurar um bloco de localização para sempre retornar um único arquivo no nginx?

12

No meu aplicativo, desejo que o local "/" retorne um arquivo estático index.html, que "/ static" sirva arquivos estáticos de uma pasta e que todas as outras solicitações retornem 404 NOT FOUND. Mais tarde, redirecionarei todas as outras solicitações para um servidor WSGI.

Esta é atualmente minha configuração:

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

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

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

A pasta estática está funcionando perfeitamente, mas "/" está retornando 404 NOT FOUND. Eu também tentei:

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

No bloco de localização, mas isso retorna 500 ERRO DE SERVIDOR INTERNO. Parece aliasque não gosta de arquivos únicos. Além disso, eu tentei:

try_files static/index_debug.html;

Mas isso impede que o servidor inicie com o erro "número inválido de argumentos na diretiva try_files". Aparentemente, try_filesna verdade, é necessário que você tente mais de um arquivo, que não é o comportamento que estou procurando.

Então, minha pergunta é: como configurar um bloco de localização para sempre retornar um arquivo estático?


Edição: Eu vi de outras respostas que aliasrealmente devem aceitar um único arquivo como argumento, então eu tentei:

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

Mas ainda recebo apenas 500 ERROS DE SERVIDOR INTERNO. O log de erros para a solicitação "/" diz:

[alert] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" não é um diretório

Por que ele está tentando abrir "index_debug.htmlindex.html"? Não estou usando a indexdiretiva em lugar nenhum.

Hubro
fonte
Pode vocêtry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: Tentando sua sugestão location =/, recebo 404 NÃO ENCONTRADO, e location /recebo 500 ERRO DE SERVIDOR INTERNO.
Hubro 6/13
Se não estou errado, você está perdendo a diretiva Index ... Qualquer servidor da Web sempre procurará o arquivo de índice, fornecendo o URI raiz (/), acho que você pode substituir isso adicionando:location / { return 404; }
Martino Dino
@MartinoDino: Por que eu preciso disso? E onde?
Hubro 6/02/2013
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Respostas:

10

Acabei de testar isso e funciona para mim:

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

O arquivo /tmp/root/static/index_debug.htmlexiste, é claro :)

Posso acessar qualquer URL e apenas recebo a página estática.

chrskly
fonte
0

Você pode usar try_files e um redirecionamento para um local nomeado com reescrita. Como isso:

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

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

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

Se o arquivo existir /tmp/rootnele, ele será exibido, caso contrário, o uri será reescrito static/index_debug.htmle será exibido.

Kirill Zaitsev
fonte