nginx: invia tutte le richieste a una singola pagina html


156

Usando nginx, voglio preservare l'URL, ma in realtà caricare la stessa pagina, non importa quale. Userò l'URL con History.getState()per instradare le richieste nella mia app javascript. Sembra che dovrebbe essere una cosa semplice da fare?

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

funziona, ma reindirizza l'URL? Ho ancora bisogno dell'URL, voglio solo usare sempre la stessa pagina.


6
Grazie per aver posto questa domanda, quindi la risposta era pronta per me :-)
Lasse Bunk,

Risposte:


191

Penso che questo lo farà per te:

location / {
    try_files /base.html =404;
}

1
[emerg] 613 # 0: numero di argomenti non valido nella direttiva "try_files"?
prismofeverything

2
Ok prova questo: try_files $ uri /base.html;
Alex Howansky,

5
Nota: questo verificherà prima il file richiesto e, se non è presente, servirà base.html. Quindi assicurati di non avere vecchi file extra presenti nella directory principale del documento, o verranno serviti direttamente se interrogati.
Alex Howansky,

22
L'uso di try_files '' /base.html;(stringa vuota come primo argomento per try_files) evita la ricerca di un file chiamato $uri.
davidjb,

17
try_files '' /base.html;mi ha dato un problema di reindirizzamento e un errore interno del server, ma modificandolo per risolverlo try_files '' /base.html =404;, se aiuta qualcuno.
William Turrell,

30

L'utilizzo try_filesnon ha funzionato per me, ma ha causato un errore di riscrittura o ciclo di reindirizzamento interno nei miei registri.

I documenti di Nginx avevano alcuni dettagli aggiuntivi:

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

Quindi ho finito per usare il seguente:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}

1
try_files '' /base.html =404;(vedi sopra)
Marc

Questo ha funzionato per me, ma in realtà non avevo bisogno della location = /base.html { expires 30s }parte.
maechler,

17

La riscrittura originale dovrebbe quasi funzionare. Non sono sicuro del motivo per cui sarebbe il reindirizzamento, ma penso che quello che vuoi davvero sia giusto

rewrite ^ /base.html break;

Dovresti essere in grado di metterlo in una posizione o direttamente nel server.


13

Questo ha funzionato per me:

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

Ciò mi ha permesso di creare un URL generico per un'app javascript a pagina singola. Tutti i file statici come CSS, font e JavaScript creati da npm run build verranno trovati se si trovano nella stessa directory di index.html.

Se i file statici fossero in un'altra directory, per qualche motivo, avresti anche bisogno di qualcosa come:

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

10

Questo ha funzionato per me:

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

7

Il modo corretto sarebbe:

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

L'utilizzo lastconsentirà a nginx di trovare un nuovo locationblocco adatto in base al risultato della riscrittura.

try_files è anche un approccio perfettamente valido a questo problema.

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.