nginx: envia todas as solicitações para uma única página html

156

Usando o nginx, quero preservar o URL, mas na verdade carregue a mesma página, não importa o quê. Usarei o URL com History.getState()para rotear as solicitações no meu aplicativo javascript. Parece que deve ser uma coisa simples de fazer?

location / {
    rewrite (.*) base.html break;
}

funciona, mas redireciona o url? Ainda preciso do URL, só quero sempre usar a mesma página.

prisma de tudo
fonte
6
Obrigado por fazer esta pergunta então a resposta estava pronto para me :-)
Lasse Bunk

Respostas:

191

Eu acho que isso fará isso por você:

location / {
    try_files /base.html =404;
}
Alex Howansky
fonte
1
[emerg] 613 # 0: número inválido de argumentos na diretiva "try_files"?
Prismofeverything
2
Ok, tente o seguinte: try_files $ uri /base.html;
Alex Howansky
5
Nota - isso primeiro verificará o arquivo solicitado e, se não estiver lá, servirá base.html. Portanto, verifique se não há arquivos extras antigos no diretório raiz do documento, ou eles serão exibidos diretamente se consultados.
Alex Howansky
22
Usar try_files '' /base.html;(string vazia como o primeiro argumento para try_files) evita a pesquisa de um arquivo chamado $uri.
Davidjb 27/03
17
try_files '' /base.html;me deu um problema de redirecionamento e um erro interno do servidor, mas modificá-lo para corrigi-lo try_files '' /base.html =404;, se isso ajudar alguém.
William Turrell
30

Usar apenas try_filesnão funcionou para mim - causou um ciclo de reescrita ou redirecionamento interno erro de nos meus logs.

Os documentos do Nginx tinham alguns detalhes adicionais:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Então, acabei usando o seguinte:

root /var/www/mysite;

location / {
    try_files $uri /base.html;
}

location = /base.html {
    expires 30s;
}
Kevan Stannard
fonte
1
try_files '' /base.html =404;(veja acima)
Marc
Isso funcionou para mim, mas na verdade eu não precisava da location = /base.html { expires 30s }parte.
maechler
17

Sua reescrita original deve quase funcionar. Não sei por que isso seria redirecionado, mas acho que o que você realmente quer é apenas

rewrite ^ /base.html break;

Você deve colocá-lo em um local ou diretamente no servidor.

kolbyjack
fonte
13

Isso funcionou para mim:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

Isso me permitiu criar um URL abrangente para um aplicativo de página única javascript. Todos os arquivos estáticos, como css, fontes e javascript criados por npm run build , serão encontrados se estiverem no mesmo diretório que index.html.

Se os arquivos estáticos estiverem em outro diretório, por algum motivo, você também precisará de algo como:

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}
Mark Chackerian
fonte
10

Isso funcionou para mim:

location / {
    try_files $uri $uri/ /base.html;
}
Abhishek
fonte
7

A maneira correta seria:

location / {
    rewrite (.*) base.html last;
}

O uso lastfará com que o nginx encontre um novo locationbloco adequado de acordo com o resultado da reescrita.

try_files também é uma abordagem perfeitamente válida para esse problema.

Etherealone
fonte