J'utilise la version Angular 2.0.0-alpha.30. Lors de la redirection vers une route différente, actualisez le navigateur, son affichage Cannot GET / route.
Pouvez-vous m'aider à comprendre pourquoi cette erreur s'est produite.
angular
angular2-routing
Vinz et Tonz
la source
la source
Réponses:
Lorsque vous utilisez le routage html5, vous devez mapper toutes les routes de votre application (actuellement 404) à index.html côté serveur. Voici quelques options pour vous:
en utilisant live-server: https://www.npmjs.com/package/live-server
en utilisant nginx: http://nginx.org/en/docs/beginners_guide.html
Tomcat - configuration de web.xml. D'après le commentaire de Kunin
la source
pub serve
? De cette façon, je n'ai pas besoin depub build
beaucoup pendant le développement. J'ai essayé maisproxy_pass
ne fonctionne pas très bien avecerror_page
.Avertissement: ce correctif fonctionne avec Alpha44
J'ai eu le même problème et je l'ai résolu en implémentant la stratégie HashLocationStrategy répertoriée dans l'aperçu de l'API Angular.io.
https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html
Commencez par importer les directives nécessaires
Et enfin, bootstrap tout ensemble comme ça
Votre itinéraire apparaîtra comme http: // localhost / # / route et lorsque vous actualiserez, il se rechargera à son bon endroit.
J'espère que cela pourra aider!
la source
#
sera ajouté automatiquement dans l'URL. existe-t-il une solution pour supprimer # de l'URL en utilisant ceci?#
serait optimal.PathLocationStrategy
mais cela ne fonctionne pas pour moi. soit j'ai utilisé une mauvaise méthode, soit je ne sais pas comment utiliser PathLocationStrategy.Angular par défaut utilise le pushstate HTML5 (
PathLocationStrategy
en argot angulaire).Soit vous avez besoin d'un serveur qui traite toutes les demandes comme il le demandait,
index.html
soit vous passez àHashLocationStrategy
(avec # dans l'URL des routes) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class. htmlVoir également https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/
Pour passer à
HashLocationStrategy
utilisermise à jour pour> = RC.5 et 2.0.0 final
ou plus court avec
useHash
assurez-vous d'avoir toutes les importations requises
Pour le nouveau routeur (RC.3)
peut également causer 404.
Il nécessite à la place
mise à jour pour> = RC.x
mise à jour pour> = beta.16 Les importations ont changé
<beta.16
Voir aussi https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 rupture-changements
la source
update for >= RC.x
(RC.2) fonctionne avecrouter 3.0.0-alpha.7
, maisprovide
annoté comme obsolète sans informations sur la fonction qui l'a remplacé.{provide: SomeClass, useClass: OtherClass}
Je pense que l'erreur que vous voyez est que vous demandez http: // localhost / route qui n'existe pas. Vous devez vous assurer que votre serveur mappera toutes les demandes sur votre page principale index.html.
Comme Angular 2 utilise le routage html5 par défaut plutôt que d'utiliser des hachages à la fin de l'url, l'actualisation de la page ressemble à une demande d'une ressource différente.
la source
Il s'agit d'une situation courante dans toutes les versions de routeur si vous utilisez la stratégie de localisation HTML par défaut.
Ce qui se passe, c'est que l'URL de la barre du navigateur est une URL HTML complète normale, comme par exemple:
http://localhost/route
.Ainsi, lorsque nous appuyons sur Entrée dans la barre du navigateur, une requête HTTP réelle est envoyée au serveur pour obtenir un fichier nommé
route
.Le serveur n'a pas un tel fichier, et ni quelque chose comme express n'est configuré sur le serveur pour gérer la demande et fournir une réponse, de sorte que le serveur renvoie 404 Not Found, car il n'a pas pu trouver le
route
fichier.Ce que nous souhaitons, c'est que le serveur renvoie le
index.html
fichier contenant l'application monopage. Ensuite, le routeur doit démarrer et traiter le/route
URL et afficher le composant mappé dessus.Donc, pour résoudre le problème, nous devons configurer le serveur pour qu'il retourne
index.html
(en supposant qu'il s'agit du nom de votre fichier d'application d'une seule page) au cas où la demande ne pourrait pas être traitée, par opposition à un 404 Not Found.La manière de procéder dépendra de la technologie côté serveur utilisée. Si c'est Java par exemple, vous devrez peut-être écrire un servlet, dans Rails ce sera différent, etc.
Pour donner un exemple concret, si par exemple vous utilisez NodeJs, vous devrez écrire un middleware comme celui-ci:
Et puis enregistrez-le à la toute fin de la chaîne middleware:
Cela servira
index.html
au lieu de renvoyer un 404, le routeur démarrera et tout fonctionnera comme prévu.la source
Assurez-vous qu'il est placé dans l'élément head de votre index.html:
L' exemple de la documentation Angular2 Routing & Navigation utilise le code suivant dans l'en-tête à la place (ils expliquent pourquoi dans l'exemple en direct de la documentation):
Lorsque vous actualisez une page, cela définit dynamiquement le href de base sur votre document.location actuel. Je pouvais voir cela causer une certaine confusion pour les gens qui parcouraient la documentation et essayaient de reproduire le plunker.
la source
Si vous souhaitez pouvoir entrer des URL dans le navigateur sans configurer votre serveur AppServer pour gérer toutes les demandes à index.html, vous devez utiliser HashLocationStrategy .
Le moyen le plus simple de configurer est d'utiliser:
Au lieu de:
Avec HashLocationStrategy, vos URL seront comme:
la source
#
de l'URL, pouvons-nous supprimer cela?J'ai eu le même problème avec l'utilisation de webpack-dev-server. J'ai dû ajouter l'option devServer à mon pack Web.
Solution:
la source
Si vous utilisez Apache ou Nginx en tant que serveur, vous devez créer un
.htaccess
moteur de réécriture (s'il n'a pas été créé auparavant) et "On"la source
Mon serveur est Apache, ce que j'ai fait pour réparer 404 lors de l'actualisation ou de la liaison profonde est très simple. Ajoutez simplement une ligne dans la configuration apache vhost:
Ainsi, toute erreur 404 sera redirigée vers index.html, ce que veut le routage angular2.
L'exemple de fichier vhost complet:
Quel que soit le serveur que vous utilisez, je pense que tout l'intérêt est de trouver les moyens de configurer le serveur pour qu'il redirige 404 vers votre index.html.
la source
La configuration du serveur n'est pas une solution pour un SPA, c'est ce que même je pense. Vous ne voulez pas recharger à nouveau un SPA angulaire si un mauvais itinéraire arrive, n'est-ce pas? Je ne vais donc pas dépendre d'une route de serveur et rediriger vers une autre route, mais oui, je laisserai index.html gérer toutes les demandes de routes angulaires du chemin angulaire de l'application.
Essayez ceci au lieu d'itinéraires différents ou erronés. Cela fonctionne pour moi, pas sûr mais cela semble être un travail en cours. J'ai trébuché moi-même face à un problème.
https://github.com/angular/angular/issues/4055
Cependant, n'oubliez pas de configurer vos dossiers de serveur et vos droits d'accès au cas où vous auriez des scripts HTML ou Web qui ne sont pas SPA. Sinon, vous rencontrerez des problèmes. Pour moi, face à un problème comme vous, c'était un mélange de configuration de serveur et plus.
la source
pour une solution rapide angulaire 5, éditez app.module.ts et ajoutez
{useHash:true}
après les appRoutes.la source
Les applications angulaires sont des candidats parfaits pour servir avec un simple serveur HTML statique. Vous n'avez pas besoin d'un moteur côté serveur pour composer dynamiquement les pages d'application, car Angular le fait du côté client.
Si l'application utilise le routeur Angular, vous devez configurer le serveur pour renvoyer la page hôte de l'application (index.html) lorsqu'on vous demande un fichier qu'il ne possède pas.
Une application routée doit prendre en charge les "liens profonds". Un lien profond est une URL qui spécifie un chemin vers un composant dans l'application. Par exemple, http://www.example.com/heroes/42 est un lien profond vers la page de détails du héros qui affiche le héros avec l'ID: 42.
Il n'y a aucun problème lorsque l'utilisateur accède à cette URL à partir d'un client en cours d'exécution. Le routeur angulaire interprète l'URL et les achemine vers cette page et ce héros.
Mais en cliquant sur un lien dans un e-mail, en le saisissant dans la barre d'adresse du navigateur ou en actualisant simplement le navigateur sur la page de détails du héros, toutes ces actions sont gérées par le navigateur lui-même, en dehors de l'application en cours d'exécution. Le navigateur fait une demande directe au serveur pour cette URL, en contournant le routeur.
Un serveur statique renvoie systématiquement index.html lorsqu'il reçoit une requête pour http://www.example.com/ . Mais il rejette http://www.example.com/heroes/42 et renvoie une erreur 404 - Not Found sauf s'il est configuré pour renvoyer index.html à la place
Si ce problème s'est produit en production, suivez les étapes ci-dessous
1) Ajoutez un fichier Web.Config dans le dossier src de votre application angular. Placez-y le code ci-dessous.
2) Ajoutez-y une référence dans angular-cli.json. Dans angular-cli.json, placez Web.config dans le bloc assets comme indiqué ci-dessous.
3) Vous pouvez maintenant créer la solution pour la production en utilisant
Cela créera un dossier dist. Les fichiers dans le dossier dist sont prêts à être déployés dans n'importe quel mode.
la source
Vous pouvez utiliser cette solution pour une application moyenne, j'ai utilisé ejs comme moteur de vue:
et également défini dans angular-cli.json
cela fonctionnera bien au lieu de
son problème de création avec les appels get db et le retour de index.html
la source
Pour ceux d'entre nous qui luttent contre IIS: utilisez le code PowerShell suivant pour résoudre ce problème en vous basant sur la documentation officielle Angular 2 (que quelqu'un a publiée dans ce fil de discussion? Http://blog.angular-university.io/angular2-router/ )
Cela redirige le 404 vers le fichier /index.html selon la suggestion dans la documentation Angular 2 (lien ci-dessus).
la source
Vous pouvez essayer ci-dessous. Ça marche pour moi!
main.component.ts
Vous pouvez encore améliorer path.substr (2) pour le fractionner en paramètres de routeur. J'utilise angular 2.4.9
la source
i Il suffit d'ajouter .htaccess à la racine.
ici, j'ajoute simplement le point '.' (répertoire parent) dans /index.html à ./index.html,
assurez-vous que votre fichier index.html dans le chemin de base est le chemin du répertoire principal et défini dans la construction du projet.
la source
Je voulais conserver le chemin de l'URL des sous-pages en mode HTML5 sans redirection vers l'index et aucune des solutions disponibles ne m'a dit comment faire cela, c'est ainsi que je l'ai accompli:
Créez des répertoires virtuels simples dans IIS pour tous vos itinéraires et faites-les pointer vers la racine de l'application.
Enveloppez votre system.webServer dans votre Web.config.xml avec cette balise d'emplacement, sinon vous obtiendrez des erreurs en double lors du chargement de Web.config une deuxième fois avec le répertoire virtuel:
la source
J'ai vérifié dans angular 2 seed comment cela fonctionne.
Vous pouvez utiliser express-history-api-fallback pour rediriger automatiquement lorsqu'une page est rechargée.
Je pense que c'est le moyen le plus élégant de résoudre ce problème IMO.
la source
Si vous souhaitez utiliser PathLocationStrategy:
Application monopage avec Java EE / Wildfly: configuration côté serveur
la source
2017-juillet-11: Puisque ceci est lié à une question ayant ce problème mais utilisant Angular 2 avec Electron, j'ajouterai ma solution ici.
Tout ce que j'avais à faire était de supprimer
<base href="./">
de mon index.html et Electron a recommencé à recharger la page avec succès.la source
Ajouter des importations:
Et dans le fournisseur NgModule, ajoutez:
Dans le fichier principal index.html de l'application, changez le href de base en
./index.html
de/
L'application lorsqu'elle est déployée sur n'importe quel serveur donnera une URL réelle pour la page accessible depuis n'importe quelle application externe.
la source
L'ajout de .htaccess à la racine a résolu 404 tout en actualisant la page en angular 4 apache2.
la source
Je pense que vous obtenez 404 parce que vous demandez http: // localhost / route qui n'existe pas sur le serveur tomcat. Comme Angular 2 utilise le routage html 5 par défaut plutôt que d'utiliser des hachages à la fin de l'URL, l'actualisation de la page ressemble à une demande d'une ressource différente.
Lorsque vous utilisez le routage angulaire sur tomcat, vous devez vous assurer que votre serveur mappera toutes les routes de votre application à votre index.html principal tout en actualisant la page. Il existe plusieurs façons de résoudre ce problème. Celui qui vous convient, vous pouvez opter pour cela.
1) Mettez le code ci-dessous dans web.xml de votre dossier de déploiement:
2) Vous pouvez également essayer d'utiliser HashLocationStrategy avec # dans l'URL des routes:
Essayez d'utiliser:
RouterModule.forRoot (routes, {useHash: true})
Au lieu de:
RouterModule.forRoot (routes)
Avec HashLocationStrategy, vos URL seront comme:
http: // localhost / # / route
3) Valve de réécriture d'URL Tomcat: réécrivez les URL en utilisant une configuration de niveau serveur pour rediriger vers index.html si la ressource n'est pas trouvée.
3.1) Dans le dossier META-INF, créez un fichier context.xml et copiez le contexte ci-dessous à l'intérieur.
3.2) Dans WEB-INF, créez le fichier rewrite.config (ce fichier contient la règle de réécriture d'URL et utilisé par tomcat pour la réécriture d'URL). À l'intérieur de rewrite.config, copiez le contenu ci-dessous:
la source
Ce n'est pas la bonne réponse, mais lors de l'actualisation, vous pouvez rediriger tous les appels morts vers la page d'accueil en sacrifiant la page 404, c'est un hack temporaire, il suffit de relire le fichier 404.html
la source
La meilleure solution pour résoudre le "routeur ne fonctionnant pas lors du rechargement du navigateur" est que nous devrions utiliser spa-fall back. Si vous utilisez l'application angular2 avec asp.net core, nous devons la définir sur la page "StartUp.cs". sous les routages MVC. Je joins le code.
la source
La réponse est assez délicate. Si vous utilisez un ancien serveur Apache (ou IIS), vous obtenez le problème car les pages angulaires n'existent pas pour de vrai. Ils sont "calculés" à partir de la route angulaire.
Il existe plusieurs façons de résoudre le problème. La première consiste à utiliser la stratégie HashLocationStrategy offerte par Angular. Mais un signe pointu est ajouté dans l'URL. C'est principalement pour la compatibilité avec Angular 1 (je suppose). Le fait est que la partie après le sharp ne fait pas partie de l'URL (alors le serveur résout la partie avant le signe "#"). Cela peut être parfait.
Voici une méthode améliorée (basée sur l'astuce 404). Je suppose que vous avez une version "distribuée" de votre application angulaire (
ng build --prod
si vous utilisez Angular-CLI) et que vous accédez aux pages directement avec votre serveur et que PHP est activé.Si votre site web est basé sur des pages (Wordpress par exemple) et que vous n'avez qu'un seul dossier dédié à Angular (nommé "dist" dans mon exemple), vous pouvez faire quelque chose de bizarre mais, au final, simple. Je suppose que vous avez stocké vos pages angulaires dans "/ dist" (avec le
<BASE HREF="/dist/">
). Maintenant, utilisez une redirection 404 et l'aide de PHP.Dans votre configuration Apache (ou dans le
.htaccess
fichier de votre répertoire d'application angulaire), vous devez ajouterErrorDocument 404 /404.php
Le 404.php commencera par le code suivant:
où
$angular
est la valeur stockée dans le HREF de votre angulaireindex.html
.Le principe est assez simple, si Apache ne trouve pas la page, une redirection 404 est faite vers le script PHP. Nous vérifions simplement si la page est à l'intérieur du répertoire d'application angulaire. Si c'est le cas, nous chargeons simplement l'index.html directement (sans redirection): cela est nécessaire pour garder l'URL inchangée. Nous changeons également le code HTTP de 404 à 200 (juste mieux pour les robots d'exploration).
Que faire si la page n'existe pas dans l'application angulaire? Eh bien, nous utilisons le "catch all" du routeur angulaire (voir la documentation du routeur angulaire).
Cette méthode fonctionne avec une application Angular intégrée dans un site Web basique (je pense que ce sera le cas à l'avenir).
REMARQUES:
mod_redirect
(en réécrivant les URL) n'est pas du tout une bonne solution car les fichiers (comme les actifs) doivent être vraiment chargés, alors c'est beaucoup plus risqué que d'utiliser simplement la solution "non trouvé".ErrorDocument 404 /dist/index.html
fonctionne mais Apache répond toujours avec un code d'erreur 404 (ce qui est mauvais pour les robots d'exploration).la source
Ce n'est pas une solution permanente au problème, mais plutôt une solution de contournement ou un hack
J'ai eu ce même problème lors du déploiement de mon application angulaire sur gh-pages. J'ai d'abord été accueilli avec 404 messages lors de l'actualisation de mes pages sur gh-pages.
Puis, comme l'a souligné @gunter, j'ai commencé à utiliser
HashLocationStrategy
ce qui était fourni avec Angular 2.Mais cela est venu avec son propre ensemble de problèmes
#
dans l'URL, c'était vraiment mauvais, ce qui donnait à l'URL l'air bizarre comme çahttps://rahulrsingh09.github.io/AngularConcepts/#/faq
.J'ai commencé à faire des recherches sur ce problème et suis tombé sur un blog. J'ai essayé de lui donner une chance et cela a fonctionné.
Voici ce que j'ai fait comme mentionné dans ce blog.
Référence backalleycoder Merci à @Daniel pour cette solution de contournement.
Maintenant, l'URL ci-dessus devient https://rahulrsingh09.github.io/AngularConcepts/faq
la source
J'ai corrigé cela (en utilisant le backend Java / Spring) en ajoutant un gestionnaire qui correspond à tout ce qui est défini dans mes routes angulaires, qui renvoie index.html au lieu d'un 404. Cela (re) amorce alors efficacement l'application et charge la page correcte. J'ai aussi un gestionnaire 404 pour tout ce qui n'est pas pris en compte par cela.
la source
Si vous utilisez Apache ou Nginx comme serveur, vous devez créer un .htaccess
la source