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.


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

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

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.


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

10

Esto funcionó para mí:

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.