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.