nginx: envía todas las solicitudes a una sola página html

156

Con nginx, quiero preservar la url, pero en realidad cargar la misma página sin importar qué. Usaré la URL con History.getState()para enrutar las solicitudes en mi aplicación javascript. Parece que debería ser algo simple de hacer?

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

funciona, pero redirige la url? Todavía necesito la URL, solo quiero usar siempre la misma página.

prismatodo
fuente
66
Gracias por hacer esta pregunta, así que la respuesta estaba lista para mí :-)
Lasse Bunk

Respuestas:

191

Creo que esto lo hará por ti:

location / {
    try_files /base.html =404;
}
Alex Howansky
fuente
1
[emerg] 613 # 0: ¿número inválido de argumentos en la directiva "try_files"?
prismofeverything
2
Ok, prueba esto: try_files $ uri /base.html;
Alex Howansky
55
Nota: esto primero verificará el archivo solicitado, y si no está allí, servirá base.html. Por lo tanto, asegúrese de que no tiene archivos adicionales antiguos en el directorio raíz de su documento, o los recibirá directamente si los consulta.
Alex Howansky
22
El uso de try_files '' /base.html;(cadena vacía como primer argumento para try_files) evita la búsqueda de un archivo llamado $uri.
davidjb
17
try_files '' /base.html;me dio un problema de redirección y un error interno del servidor, pero modificarlo para try_files '' /base.html =404;solucionarlo, si ayuda a alguien.
William Turrell
30

El uso simplemente try_filesno funcionó para mí: causó un error de reescritura o un ciclo de redireccionamiento interno en mis registros.

Los documentos de Nginx tenían algunos detalles adicionales:

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

Así que terminé usando lo siguiente:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}
Kevan Stannard
fuente
1
try_files '' /base.html =404;(ver arriba)
Marc
Esto funcionó para mí, pero en realidad no necesitaba la location = /base.html { expires 30s }parte.
maechler
17

Su reescritura original casi debería funcionar. No estoy seguro de por qué estaría redirigiendo, pero creo que lo que realmente quieres es simplemente

rewrite ^ /base.html break;

Debería poder colocar eso en una ubicación o directamente en el servidor.

kolbyjack
fuente
13

Esto funcionó para mí:

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

Esto me permitió crear una URL general para una aplicación javascript de una sola página. Todos los archivos estáticos como CSS, fuentes y JavaScript creados por npm run build se encontrarán si están en el mismo directorio que index.html.

Si los archivos estáticos estuvieran en otro directorio, por alguna razón, también necesitaría algo como:

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

Esto funcionó para mí:

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

La forma correcta sería:

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

Usar lasthará que nginx encuentre un nuevo adecuadolocation bloque acuerdo con el resultado de la reescritura.

try_files También es un enfoque perfectamente válido para este problema.

Etherealone
fuente