Estoy usando la versión Angular 2.0.0-alpha.30. Cuando se redirige a una ruta diferente, luego actualice el navegador, se muestra No se puede OBTENER / ruta.
¿Me pueden ayudar a averiguar por qué ocurrió este error?
angular
angular2-routing
Vinz y Tonz
fuente
fuente
Respuestas:
Al usar el enrutamiento html5, debe asignar todas las rutas en su aplicación (actualmente 404) a index.html en el lado del servidor. Aquí hay algunas opciones para usted:
usando el servidor en vivo: https://www.npmjs.com/package/live-server
usando nginx: http://nginx.org/en/docs/beginners_guide.html
Tomcat: configuración de web.xml. Del comentario de Kunin
fuente
pub serve
? De esa manera no necesitopub build
mucho durante el desarrollo. Lo intenté peroproxy_pass
no funciona muy bienerror_page
.Descargo de responsabilidad: esta solución funciona con Alpha44
Tuve el mismo problema y lo resolví implementando la HashLocationStrategy enumerada en la Vista previa de la API Angular.io.
https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html
Comience importando las directivas necesarias
Y finalmente, ponlo todo junto así
Su ruta aparecerá como http: // localhost / # / route y cuando actualice, se volverá a cargar en el lugar adecuado.
¡Espero que ayude!
fuente
#
se agregará automáticamente en la URL. ¿Hay alguna solución para eliminar # de la URL usando esto?#
sería óptima.PathLocationStrategy
pero esto no funciona para mí. o usé un método incorrecto o no sé cómo usar PathLocationStrategy.Angular por defecto usa HTML5 pushstate (
PathLocationStrategy
en argot angular).Necesita un servidor que procese todas las solicitudes como si estuviera solicitando
index.html
o cambie aHashLocationStrategy
(con # en la URL para rutas) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class. htmlVer también https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/
Para cambiar a
HashLocationStrategy
usaractualización para> = RC.5 y 2.0.0 final
o más corto con
useHash
asegúrese de tener todas las importaciones requeridas
Para el nuevo enrutador (RC.3)
puede causar 404 también.
Requiere en su lugar
actualización para> = RC.x
actualización para> = beta.16 Las importaciones han cambiado
<beta.16
Ver también https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 cambios de ruptura
fuente
update for >= RC.x
(RC.2) funcionarouter 3.0.0-alpha.7
, pero seprovide
anota como obsoleto sin información sobre qué función lo reemplazó.{provide: SomeClass, useClass: OtherClass}
Creo que el error que está viendo es porque está solicitando http: // localhost / route que no existe. Debe asegurarse de que su servidor asignará todas las solicitudes a su página index.html principal.
Como Angular 2 usa el enrutamiento html5 de forma predeterminada en lugar de usar hashes al final de la url, actualizar la página parece una solicitud de un recurso diferente.
fuente
Esta es una situación común en todas las versiones de enrutadores si está utilizando la estrategia de ubicación HTML predeterminada.
Lo que pasa es que la URL en la barra del navegador es una URL normal de HTML, como por ejemplo:
http://localhost/route
.Entonces, cuando presionamos Enter en la barra del navegador, hay una solicitud HTTP real enviada al servidor para obtener un archivo con el nombre
route
.El servidor no tiene dicho archivo, y tampoco hay algo como express configurado en el servidor para manejar la solicitud y proporcionar una respuesta, por lo que el servidor devuelve 404 No encontrado, porque no pudo encontrar el
route
archivo.Lo que nos gustaría es que el servidor devuelva el
index.html
archivo que contiene la aplicación de página única. Luego, el enrutador debe iniciar y procesar la/route
url y mostrar el componente asignado a él.Por lo tanto, para solucionar el problema, debemos configurar el servidor para que regrese
index.html
(suponiendo que ese sea el nombre del archivo de la aplicación de una sola página) en caso de que la solicitud no se pueda manejar, en lugar de un 404 No encontrado.La forma de hacerlo dependerá de la tecnología del lado del servidor que se utilice. Si es Java, por ejemplo, es posible que tenga que escribir un servlet, en Rails será diferente, etc.
Para dar un ejemplo concreto, si por ejemplo está usando NodeJs, tendría que escribir un middleware como este:
Y luego regístralo al final de la cadena de middleware:
Esto servirá en
index.html
lugar de devolver un 404, el enrutador se activará y todo funcionará como se esperaba.fuente
Asegúrese de que esto se coloca en el elemento principal de su index.html:
El ejemplo en la documentación de enrutamiento y navegación de Angular2 utiliza el siguiente código en el encabezado (explican por qué en la nota de ejemplo en vivo de la documentación):
Cuando actualice una página, esto establecerá dinámicamente la base href en su ubicación de documento actual. Pude ver que esto causaba cierta confusión a las personas que hojeaban la documentación e intentaban replicar el saqueador.
fuente
Si desea poder ingresar las URL en el navegador sin configurar su AppServer para manejar todas las solicitudes a index.html, debe usar HashLocationStrategy .
La forma más fácil de configurar es usar:
En vez de:
Con HashLocationStrategy, tus URL serán como:
fuente
#
de url, ¿podemos eliminar esto?Tuve el mismo problema con el uso de webpack-dev-server. Tuve que agregar la opción devServer a mi paquete web.
Solución:
fuente
Si está utilizando Apache o Nginx como servidor, debe crear un
.htaccess
RewriteEngine (si no se creó antes) y "On"fuente
Mi servidor es Apache, lo que hice para arreglar 404 cuando la actualización o la vinculación profunda es muy simple. Simplemente agregue una línea en la configuración de apache vhost:
Para que cualquier error 404 sea redirigido a index.html, que es lo que quiere el enrutamiento angular2.
El ejemplo completo del archivo vhost:
No importa qué servidor esté utilizando, creo que el punto es descubrir las formas de configurar el servidor para redirigir 404 a su index.html.
fuente
La configuración del servidor no es una solución para un SPA, es lo que incluso yo pienso. No desea volver a cargar un SPA angular si entra una ruta incorrecta, ¿verdad? Por lo tanto, no dependeré de una ruta del servidor y redirigiré a otra ruta, pero sí dejaré que index.html maneje todas las solicitudes de rutas angulares de la ruta angular de la aplicación.
Intente esto en lugar de lo contrario o rutas incorrectas. Funciona para mí, no estoy seguro, pero parece un trabajo en progreso. Me tropecé con esto cuando me enfrento a un problema.
https://github.com/angular/angular/issues/4055
Sin embargo, recuerde configurar las carpetas de su servidor y acceder directamente en caso de que tenga HTML o scripts web que no sean SPA. De lo contrario, enfrentará problemas. Para mí, cuando me enfrento a un problema como tú, era una combinación de configuración de servidor y superior.
fuente
para la solución rápida angular 5, edite app.module.ts y agregue
{useHash:true}
después de appRoutes.fuente
Las aplicaciones angulares son candidatas perfectas para servir con un servidor HTML estático simple. No necesita un motor del lado del servidor para componer dinámicamente las páginas de la aplicación porque Angular lo hace en el lado del cliente.
Si la aplicación usa el enrutador angular, debe configurar el servidor para que devuelva la página de host de la aplicación (index.html) cuando se le solicite un archivo que no tiene.
Una aplicación enrutada debe soportar "enlaces profundos". Un enlace profundo es una URL que especifica una ruta a un componente dentro de la aplicación. Por ejemplo, http://www.example.com/heroes/42 es un enlace profundo a la página de detalles del héroe que muestra al héroe con id: 42.
No hay ningún problema cuando el usuario navega a esa URL desde un cliente en ejecución. El enrutador angular interpreta la URL y las rutas a esa página y héroe.
Pero al hacer clic en un enlace de un correo electrónico, ingresarlo en la barra de direcciones del navegador o simplemente actualizar el navegador mientras está en la página de detalles del héroe: todas estas acciones son manejadas por el navegador, fuera de la aplicación en ejecución. El navegador realiza una solicitud directa al servidor para esa URL, sin pasar por el enrutador.
Un servidor estático devuelve rutinariamente index.html cuando recibe una solicitud de http://www.example.com/ . Pero rechaza http://www.example.com/heroes/42 y devuelve un error 404 - No encontrado a menos que esté configurado para devolver index.html en su lugar
Si este problema ocurrió en la producción, siga los pasos a continuación.
1) Agregue un archivo Web.Config en la carpeta src de su aplicación angular. Coloque debajo del código en él.
2) Agregue una referencia a él en angular-cli.json. En angular-cli.json coloque Web.config en el bloque de activos como se muestra a continuación.
3) Ahora puede construir la solución para producción usando
Esto creará una carpeta dist. Los archivos dentro de la carpeta dist están listos para ser implementados por cualquier modo.
fuente
Puede usar esta solución para aplicaciones malas, usé ejs como motor de vista:
y también establecido en angular-cli.json
funcionará bien en lugar de
está creando un problema con obtener llamadas de db y devolver index.html
fuente
Para aquellos de nosotros que luchamos por la vida en IIS: use el siguiente código de PowerShell para solucionar este problema basado en los documentos oficiales de Angular 2 (que alguien publicó en este hilo) http://blog.angular-university.io/angular2-router/ )
Esto redirige el 404 al archivo /index.html según la sugerencia en los documentos de Angular 2 (enlace de arriba).
fuente
Puedes probar a continuación. ¡Esto funciona para mi!
main.component.ts
Puede mejorar aún más path.substr (2) para dividir en parámetros de enrutador. Estoy usando angular 2.4.9
fuente
Solo agrego .htaccess en la raíz.
aquí solo agrego el punto '.' (directorio principal) en /index.html a ./index.html,
asegúrese de que su archivo index.html en la ruta base es la ruta del directorio principal y se configura en la compilación del proyecto.
fuente
Quería preservar la ruta URL de las subpáginas en modo HTML5 sin una redirección al índice y ninguna de las soluciones me dijo cómo hacerlo, así que así es como lo logré:
Cree directorios virtuales simples en IIS para todas sus rutas y apúntelos a la raíz de la aplicación.
Envuelva su system.webServer en su Web.config.xml con esta etiqueta de ubicación, de lo contrario obtendrá errores duplicados al cargar Web.config por segunda vez con el directorio virtual:
fuente
Comprobé en angular 2 seed cómo funciona.
Puedes usar express-history-api-fallback para redirigir automáticamente cuando se recarga una página.
Creo que es la forma más elegante de resolver este problema de la OMI.
fuente
Si quieres usar PathLocationStrategy:
Aplicación de una sola página con Java EE / Wildfly: configuración del lado del servidor
fuente
2017-julio-11: ya que esto está vinculado a una pregunta que tiene este problema pero que usa Angular 2 con Electron, agregaré mi solución aquí.
Todo lo que tenía que hacer era eliminarlo
<base href="./">
de mi index.html y Electron comenzó a volver a cargar la página con éxito.fuente
Agregar importaciones:
Y en el proveedor de NgModule, agregue:
En principal del archivo index.html de la aplicación cambiar el href de base a
./index.html
partir de/
La aplicación cuando se implementa en cualquier servidor dará una URL real para la página a la que se puede acceder desde cualquier aplicación externa.
fuente
Simplemente agregando .htaccess en la raíz resolvió 404 mientras actualizaba la página en angular 4 apache2.
fuente
Creo que está obteniendo 404 porque está solicitando http: // localhost / route que no existe en el servidor tomcat. Como Angular 2 usa el enrutamiento html 5 de forma predeterminada en lugar de usar hashes al final de la URL, actualizar la página parece una solicitud de un recurso diferente.
Cuando utilice el enrutamiento angular en Tomcat, debe asegurarse de que su servidor asignará todas las rutas de su aplicación a su index.html principal mientras actualiza la página. Hay varias formas de resolver este problema. Cualquiera que te convenga, puedes ir por eso.
1) Ponga el siguiente código en web.xml de su carpeta de implementación:
2) También puede intentar usar HashLocationStrategy con # en la URL de las rutas:
Intenta usar:
RouterModule.forRoot (rutas, {useHash: true})
En vez de:
RouterModule.forRoot (rutas)
Con HashLocationStrategy, tus URL serán como:
http: // localhost / # / route
3) Válvula de reescritura de URL de Tomcat: vuelva a escribir las URL utilizando una configuración de nivel de servidor para redirigir a index.html si no se encuentra el recurso.
3.1) Dentro de la carpeta META-INF, cree un archivo context.xml y copie el siguiente contexto dentro de él.
3.2) Dentro de WEB-INF, cree el archivo rewrite.config (este archivo contiene la regla para la reescritura de URL y lo utiliza tomcat para la reescritura de URL). Dentro de rewrite.config, copie el contenido a continuación:
fuente
Esta no es la respuesta correcta, pero al actualizar puede redirigir todas las llamadas inactivas a la página de inicio sacrificando la página 404, es un hack temporal que solo se reproduce en el archivo 404.html
fuente
La mejor solución para resolver el "enrutador que no funciona al recargar el navegador" es que deberíamos usar spa-fall back. Si está utilizando la aplicación angular2 con asp.net core, entonces debemos definirla en la página "StartUp.cs". bajo rutas MVC. Estoy adjuntando el código.
fuente
La respuesta es bastante complicada. Si usa un servidor Apache antiguo (o IIS), obtendrá el problema porque las páginas angulares no existen de verdad. Se "calculan" a partir de la ruta angular.
Hay varias formas de solucionar el problema. Una es utilizar la estrategia HashLocationStrategy que ofrece Angular. Pero se agrega un signo agudo en la URL. Esto es principalmente por compatibilidad con Angular 1 (supongo). El hecho es que la parte después de que el sostenido no es parte de la URL (entonces el servidor resuelve la parte antes del signo "#"). Eso puede ser perfecto.
Aquí un método mejorado (basado en el truco 404). Supongo que tiene una versión "distribuida" de su aplicación angular (
ng build --prod
si usa Angular-CLI) y accede a las páginas directamente con su servidor y PHP está habilitado.Si su sitio web está basado en páginas (Wordpress, por ejemplo) y solo tiene una carpeta dedicada a Angular (llamada "dist" en mi ejemplo), puede hacer algo extraño pero, al final, simple. Supongo que ha almacenado sus páginas angulares en "/ dist" (con el correspondiente
<BASE HREF="/dist/">
). Ahora use una redirección 404 y la ayuda de PHP.En su configuración de Apache (o en el
.htaccess
archivo del directorio angular de su aplicación), debe agregarErrorDocument 404 /404.php
El 404.php comenzará con el siguiente código:
donde
$angular
es el valor almacenado en el HREF de su angularindex.html
.El principio es bastante simple, si Apache no encuentra la página, se realiza una redirección 404 al script PHP. Simplemente verificamos si la página está dentro del directorio angular de la aplicación. Si es el caso, simplemente cargamos el index.html directamente (sin redirigir): esto es necesario para mantener la URL sin cambios. También cambiamos el código HTTP de 404 a 200 (simplemente mejor para los rastreadores).
¿Qué pasa si la página no existe en la aplicación angular? Bueno, usamos el "capturar todo" del enrutador angular (consulte la documentación del enrutador angular).
Este método funciona con una aplicación angular integrada dentro de un sitio web básico (creo que será el caso en el futuro).
NOTAS
mod_redirect
(reescribiendo las URL) no es una buena solución porque los archivos (como los activos) tienen que estar realmente cargados, entonces es mucho más riesgoso que simplemente usar la solución "no encontrada".ErrorDocument 404 /dist/index.html
Works, pero Apache todavía responde con un código de error 404 (que es malo para los rastreadores).fuente
Esta no es una solución permanente para el problema, sino más bien una solución o un hack
Tuve este mismo problema al implementar mi aplicación angular en gh-pages. Primero me saludaron con mensajes 404 cuando actualicé mis páginas en gh-pages.
Entonces, como lo señaló @gunter, comencé a usar el
HashLocationStrategy
que se proporcionó con Angular 2.Pero eso vino con su propio conjunto de problemas;
#
en la url, fue realmente malo, hizo que la url se viera tan extraña como estahttps://rahulrsingh09.github.io/AngularConcepts/#/faq
.Comencé a investigar sobre este problema y encontré un blog. Intenté darle una oportunidad y funcionó.
Aquí está lo que hice como se menciona en ese blog.
Referencia backalleycoder Gracias a @Daniel por esta solución.
Ahora la URL anterior cambia a https://rahulrsingh09.github.io/AngularConcepts/faq
fuente
Solucioné esto (usando Java / Spring backend) agregando un controlador que coincide con todo lo definido en mis rutas angulares, que devuelve index.html en lugar de un 404. Esto (efectivamente) reinicia la aplicación y carga la página correcta. También tengo un controlador 404 para cualquier cosa que no sea atrapada por esto.
fuente
Si está utilizando Apache o Nginx como servidor, debe crear un .htaccess
fuente