He visto muchas preguntas aquí que abordan esto, pero al usar un servidor apache, para mi aplicación, estoy usando AWS S3 con Cloudfront, necesito que la aplicación funcione sin el feo hash en la URL.
¿Hay algún enfoque que se pueda hacer para poder actualizar o acceder a los enlaces directamente sin usar el hash?
Si se requiere alguna parte del código, puedo incluirla, pero no veo la necesidad de hacerlo, ya que nada falla, solo necesito una estrategia de trabajo.
Saludos.
Módulo de enrutamiento de mi aplicación
@NgModule({ imports: [ RouterModule.forRoot(routes, { useHash: true }) ], exports: [ RouterModule ] })Eliminar el hash true funciona para la navegación pero no para actualizar la página o enlaces directos
Eliminar la estrategia hash,
RouterModule.forRoot(routes, { useHash: false });Vaya a la configuración de hospedaje de sitio web estático de su depósito y configure Documento de error en index.html.
Básicamente, solo queremos servir index.html en todos los casos, ya que ese es el archivo que debe servirse en todos los casos, ya que la compilación angular no tiene una estructura de carpetas para rutas como sitios web estáticos.
Ahora sus rutas se verán así:
localhost:4200/homeEn lugar de:
localhost:4200/#/homeReferencia de AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/CustomErrorDocSupport.html#custom-error-document
Antes de escribir la solución, permítanme explicar brevemente lo que se necesita hacer. En general, la navegación de páginas en aplicaciones de una sola página (SPA) se logra mediante código javascript que manipula la vista y/o monitorea la URL y los eventos del historial de navegación. Cuando inicia la aplicación y hace clic en diferentes enlaces, por ejemplo /user , la aplicación no se vuelve a cargar, sigue siendo la misma aplicación cargada a través de root index.html que reacciona al enlace en el que se hizo clic cambiando a la vista o componente correspondiente y modificando la URL en la barra de direcciones.
Sin embargo, si navega a example.com/user directamente después de abrir el navegador (sin la carga inicial de la raíz ejemplo.com), el navegador enviará una solicitud a la ruta /user que en realidad no existe ni en el depósito S3, ni en distribución frente a la nube, aunque fallará. Nuestro objetivo es obligar a S3 y Cloudfront a devolver siempre el archivo raíz index.html, independientemente de cuál haya sido la ruta original de la solicitud.
Para lograrlo, necesita cambiar ligeramente la configuración del depósito S3 y la distribución de Cloudfront.
Antes de pasar a los cambios relacionados con AWS, cambie la propiedad useHash de la importación de RouterModule a false :
RouterModule.forRoot(routes, { useHash: false })index.html en ambos campos: documento de índice y documento de error .Luego guarde la configuración. En realidad, ahora su archivo index.html se servirá para cualquier ruta igual que para la raíz. Ya debería notar eso cuando abre su sitio web después de que se aplicaron los cambios anteriores. Sin embargo, notará que el código de respuesta es 404 a pesar de que la aplicación se abre correctamente; sucede porque todavía es la respuesta "no encontrada" ya que la ruta no existe. También se necesitan algunos cambios en la configuración de la nube para que funcione aún mejor.
Ahora intente abrir el sitio web; ya no debería ver las respuestas 404 porque ahora todas las solicitudes (incluso las rutas no existentes) tienen el código 200.