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.


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;
}

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;
}

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.


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/;
}

10

Isso funcionou para mim:

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.