Necesito ayuda con la configuración de nginx para SPA. Hice el mío a partir de piezas que logré buscar en Google, pero no entiendo cómo funciona.
Lo que necesito:
1) Servir archivos estáticos
location ~ \.(css|js|svg|woff|woff2|ico|ttf|eot|jpe?g|png|txt)$ { try_files $uri $uri/ =404; expires 1y; add_header Cache-Control "public"; }Si no se encuentra el archivo, devuelvo 404. Está bien si solo escribo un nombre de archivo incorrecto en la URL, pero si escribo un nombre de archivo incorrecto en mi index.html en lugar de la página 404, obtengo una página en blanco. ¿Se supone que debe ser así?
2) Las solicitudes a /api deben redirigirse al backend del nodo
location /api { try_files '' @proxy; } location @proxy { proxy_pass http://localhost:3000; }No estoy muy seguro en esta línea, si se supone que debe verse de esta manera
try_files '' @proxy;3) Y el mayor problema, las solicitudes que no coinciden con nada deben devolver index.html
location / { try_files '' /index.html; expires -1; } location = /index.html { expires -1; }Según tengo entendido, el primer bloque redirige todas las solicitudes desconocidas a index.html, pero no entiendo cómo el segundo bloque sirve este index.html. No escribo para servir este archivo, no hay una directiva try_files.
1) Servir archivos estáticos
Tu solución está perfectamente bien. Solo es necesario si necesita establecer diferentes encabezados de caducidad y control de caché para estos URI. La instrucción try_files no es necesaria ya que es la misma que el comportamiento predeterminado.
2) Las solicitudes a /api deben redirigirse al backend del nodo
Su solución se puede simplificar a:
location /api { proxy_pass http://localhost:3000; } Esto procesará cualquier URI que comience con /api a menos que coincida con la expresión regular del paso (1). Puede evitar eso usando el operador ^~ . Vea este documento para más detalles.
3) Y el mayor problema, las solicitudes que no coinciden con nada deben devolver index.html
Esto generalmente se implementa como:
location / { try_files $uri $uri/ /index.html; ... } A menos que la solicitud coincida con cualquier otra location , archivo o directorio, el URI se reescribirá internamente en /index.html . Vea este documento para más detalles.