Angular 2.0 routeur ne fonctionne pas sur recharger le navigateur
Je suis en utilisant Angulaire 2.0.0-alpha.30 version. Lors de la redirection vers une autre route, puis actualisez le navigateur , son score Ne peut pas OBTENIR /route.
Pouvez-vous m'aider à comprendre pourquoi cette erreur s'est produite.
- Je suppose que c'est stackoverflow.com/questions/16569841
- Merci pour la réponse, mais que l'on est angulaire 1.x versions . Je suis confronté à la question angulaire 2.0.
- La question est liée au problème général avec pushState pas Angulaire spécifique. Votre question ne fournissent pas suffisamment d'informations pour savoir si elle est liée.
- Angular 2.0 utilise un tout nouveau routeur de sorte que le message lié est d'aucune utilité maintenant, depuis que son vieux routeur
- Comme je l'ai dit si c'est le pushState question, il n'est pas Angulaire spécifique et ne peut être résolu par Angulaire, mais doit être fixé sur le serveur à la place.
- certains de configuration du serveur est nécessaire, jetez un oeil à ce post pour plus de détails (ajouté réponse ci-dessous). ce n'est pas conseillé de passer à la valeur de hachage de l'emplacement de la stratégie de blog.angulaire de l'université.io/angular2-routeur
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de html5 de routage, vous devez la carte de tous les itinéraires dans votre application(pour l'instant 404) pour index.html de votre côté serveur. Voici quelques options pour vous:
à l'aide de live-serveur: https://www.npmjs.com/package/live-server
$live-server --entry-file=index.html
l'aide de nginx: http://nginx.org/en/docs/beginners_guide.html
error_page 404 /index.html
Tomcat - configuration de web.xml. De Kunins'commentaire
<error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>
pub serve
? De cette façon, je n'ai pas besoin depub build
beaucoup au cours du développement. J'ai essayé, maisproxy_pass
ne fonctionne pas très bien avecerror_page
.uri
deerror_page
peut être quelque chose commelocalhost:8000/index.html
, mais il ne fonctionne pas. L'exemple de la documentation de l'indice que je peux "passer d'erreur de traitement dans un emplacement nommé", mais il ne semble pas fonctionner pour moi.edited
pour voir l'ancienne version répondreng build
pour générer mon application?Avertissement: ce correctif fonctionne avec Alpha44
J'ai eu le même problème et l'a résolu par la mise en œuvre de la HashLocationStrategy répertoriés dans l'angle.io API Aperçu.
https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html
Commencez par importer les directives nécessaires à
Et enfin, bootstrap tous ensemble comme
Votre parcours apparaissent comme http://localhost/#/route et lorsque vous actualisez, il permettra de recharger à la bonne place.
Espère que ça aide!
#
sera ajouté automatiquement dans l'URL. est-il une solution pour supprimer # à partir de l'URL en utilisant ce ?#
serait optimal.PathLocationStrategy
mais ce n'est pas de travail pour moi. soit j'ai utilisé la mauvaise méthode ou l'autre, je ne sais pas comment utiliser PathLocationStrategy.Angulaire, par défaut, utilise HTML5 pushstate (
PathLocationStrategy
Angulaire de l'argot).Vous avez besoin d'un serveur qui traite toutes les demandes, comme il demandent
index.html
ou vous passez àHashLocationStrategy
(avec # dans l'URL pour les routes) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.htmlVoir aussi https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/
Pour passer à
HashLocationStrategy
utilisationmise à jour pour >= RC.5 et 2.0.0 final
ou moins longtemps avec
useHash
vous assurer d'avoir tout les importations
Pour la nouvelle (RC.3) routeur
peut causer 404 ainsi.
Il exige plutôt
mise à jour pour >= RC.x
mise à jour pour >= beta.16 les Importations ont changé
< bêta.16
Voir aussi https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 rupture changements
update for >= RC.x
(RC.2) fonctionne avecrouter 3.0.0-alpha.7
, maisprovide
annotées comme obsolète, faute d'information sur la fonction qui l'a remplacé.{provide: SomeClass, useClass: OtherClass}
Je pense que l'erreur que vous voyez est parce que vous êtes demandant http://localhost/route qui n'existe pas. Vous devez vous assurer que votre serveur de carte toutes les demandes de votre principal index.html page.
Comme Angulaire 2 utilise html5 de routage 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 autre ressource.
C'est une situation courante dans tous les routeur versions si vous utilisez le code HTML par défaut emplacement de la stratégie.
Ce qui se passe, c'est que l'URL dans la barre du navigateur est complète normale url HTML, comme par exemple:
http://localhost/route
.Donc quand nous sommes arrivés à Entrer dans la barre du navigateur, il y a un réel requête HTTP envoyée au serveur pour obtenir un fichier nommé
route
.Le serveur n'a pas de tel fichier, et ni quelque chose comme express est configuré sur le serveur pour répondre à la demande et fournir une réponse, de sorte que le serveur retourne 404 not Found, car il ne pouvait pas trouver la
route
fichier.Ce que nous souhaitons est que le serveur renvoie le
index.html
fichier contenant le single page application. Ensuite, le routeur devrait coup de pied dans les processus et les/route
url et d'afficher le composant associé à.Afin de résoudre le problème, nous avons besoin de configurer le serveur pour revenir
index.html
(en supposant que c'est le nom de votre page unique fichier de l'application) dans le cas où la demande ne peut pas être traitée, par opposition à un 404 not Found.La façon de le faire dépend du côté serveur de la technologie utilisée. Si son langage de programmation Java par exemple, vous pourriez avoir à écrire une servlet, dans les Rails, il sera différent, etc.
Pour donner un exemple concret, si par exemple vous utilisez NodeJs, vous devez écrire un middleware comme ceci:
Et puis de l'enregistrer à la fin de la middleware de la chaîne:
Ce sera
index.html
au lieu de retourner une erreur 404, le routeur coup de pied dans et tout fonctionnera comme prévu.Assurez-vous que celui-ci est placé dans l'élément de tête de votre index.html:
La Exemple dans le Angular2 Routage & Navigation documentation utilise le code suivant dans la tête à la place (ils expliquent pourquoi dans l'exemple vivant de la note de la documentation):
Lorsque vous actualisez une page, cela permettra de définir dynamiquement la base href votre document actuel.emplacement. J'ai pu voir que cela provoque une certaine confusion pour les personnes écrémage de la documentation et en essayant de reproduire le plunker.
Si vous voulez être en mesure de saisir les url dans le navigateur sans la configuration de votre serveur d'applications pour gérer toutes les demandes de index.html, vous devez utiliser HashLocationStrategy.
La façon la plus simple à faire est de configurer à l'aide de:
Au lieu de:
Avec HashLocationStrategy votre url va être comme:
#
à partir de l'url, peut-on supprimer ce?J'ai eu le même problème avec l'aide de webpack-dev-serveur. J'ai dû ajouter de la devServer option à mon webpack.
Solution:
Si vous utilisez Apache ou Nginx comme serveur, vous devez créer un .htaccess (si pas créé avant) et "Sur" RewriteEngine
Mon serveur est Apache, ce que j'ai fait pour résoudre 404 lors de l'actualisation ou du deep linking, est très simple. Juste ajouter une ligne dans le vhost apache config:
De sorte que toute erreur 404 allez être redirigé vers index.html qui est ce angular2 de routage veut.
L'ensemble du fichier vhost exemple:
N'importe quel serveur que vous utilisez, je pense que toute la question est de trouver les moyens de config le serveur de redirection 404 à votre index.html.
De configuration du serveur n'est pas une solution pour un SPA est ce que je pense. Vous ne voulez recharger angulaire SPA à nouveau si une mauvaise voie arrive, ne vous? Donc, je ne dépend pas d'un serveur de route et de les rediriger vers d'autres parcours mais oui, je vais laisser index.html répondre à toutes les demandes angulaire routes de l'angle d'application de chemin.
Essayer ceci à la place de l'autre ou de mauvaises routes. Il fonctionne pour moi, pas sûr, mais semble comme un travail en cours. Suis tombé moi-même lorsque confronté à un problème.
https://github.com/angular/angular/issues/4055
Cependant, n'oubliez pas de configurer votre serveur de dossiers et de droit d'accès dans le cas où vous avez HTML ou des scripts web qui ne sont pas de SPA. Sinon vous ferez face à des questions. Pour moi, quand face à des problèmes comme vous, c'est un mélange de la configuration du serveur et au-dessus.
angulaire de 5 quick fix, modifier app.le module.ts et ajouter
{useHash:true}
après la appRoutes.Vous pouvez utiliser cette solution pour application moyenne, j'ai utilisé ejs comme moteur d'affichage:
et aussi de mettre en angulaires-cli.json
il fonctionnera correctement au lieu de
sa création problème avec db appels et retour index.html
Pour ceux d'entre nous qui luttent à travers la vie dans IIS: utiliser le PowerShell suivante de code pour résoudre ce problème, basé sur l'officiel Angulaire 2 docs (que quelqu'un a posté dans ce thread? http://blog.angular-university.io/angular2-router/)
Cette redirige la 404 à l' /index.html fichier selon la suggestion dans l'angle de 2 docs (lien ci-dessus).
Vous pouvez essayer ci-dessous. Il fonctionne pour moi!
principal.composante.ts
Vous pouvez encore améliorer le chemin d'accès.substr(2) de diviser en routeur paramètres. Je suis en utilisant angulaire 2.4.9
Angulaire apps sont des candidats parfaits pour servir avec une simple page HTML statique serveur. Vous n'avez pas besoin un serveur de moteur de composer dynamiquement les pages de l'application, car Angulaire n'est que sur le côté client.
Si l'application utilise l'angle de routeur, vous devez configurer le serveur pour revenir à l'application de la page d'hôte (index.html lorsqu'on lui a demandé un fichier qu'il n'a pas.
Un acheminé application devrait soutenir les "liens profonds". Un lien est une URL qui spécifie un chemin d'accès à un composant à l'intérieur de l'application. Par exemple, http://www.example.com/heroes/42 est un lien profond pour le héros de détail de la page qui affiche le héros avec l'id: 42.
Il n'y a pas de problème lorsque l'utilisateur accède à l'URL de l'intérieur de l'exécution d'un client. L'angle de routeur interprète les URL et les itinéraires à cette page et de héros.
Mais en cliquant sur un lien dans un courriel, d'entrer dans la barre d'adresse du navigateur, ou simplement rafraîchissante le navigateur tandis que sur le héros de la page de détail — l'ensemble de 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 que les URL, en contournant le routeur.
Un serveur statique renvoie systématiquement index.html lorsqu'il reçoit une demande pour http://www.example.com/. Mais il rejette http://www.example.com/heroes/42 et renvoie une erreur 404 - Non Trouvé d'erreur, sauf s'il est configuré pour le retour index.html au lieu de cela
Si ce problème s'est produite dans la production, suivez les étapes ci-dessous
1) Ajouter un site Web.Fichier de Config dans le dossier src de votre angulaire de l'application. Place ci-dessous dans le code.
2) Ajouter une référence dans angulaires-cli.json. Dans angulaires-cli.json mettre Web.config actif bloc comme indiqué ci-dessous.
3) vous pouvez Maintenant construire la solution pour la production à l'aide de
Cela va créer un dossier dist. Les fichiers à l'intérieur dist dossier est prêt pour le déploiement par tout mode.
J'ai voulu préserver le chemin de l'URL de sous-pages en mode HTML5, sans une redirection retour à l'index, et qu'aucune des solutions là-bas m'a dit comment faire, donc, c'est comment j'ai accompli:
Créer des répertoires virtuels dans IIS pour tous vos itinéraires et de les faire pointer vers la racine d'application.
L'enveloppe de votre système.serveur web dans votre Web.config.xml avec cet emplacement de la balise, sinon vous allez obtenir un double des erreurs de il Web de chargement.config un deuxième temps avec le répertoire virtuel:
J'ai vérifié dans angulaire 2 graines de la façon dont il fonctionne.
Vous pouvez utiliser express-histoire-api-secours pour rediriger automatiquement lorsqu'une page est rechargée.
Je pense que c'est la façon la plus élégante pour résoudre ce problème de l'OMI.
Si vous souhaitez utiliser PathLocationStrategy :
Single page application avec Java EE/Wildfly: côté serveur de configuration
Juste en ajoutant .htaccess de la racine résolu 404 tout en rafraîchissant la page angulaire 4 apache2.
Je pense que vous êtes l'obtention de 404 parce que votre demandez http://localhost/route qui n'existe pas sur le serveur tomcat. Comme Angulaire 2 utilise le html 5 de routage 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 autre ressource.
Lors de l'utilisation angulaire de routage sur tomcat, vous devez vous assurer que votre serveur de carte toutes les routes dans votre application à votre principale index.html tout en rafraîchissant la page. Il y a plusieurs façons de résoudre ce problème. Selon ce qui vous convient, vous pouvez aller pour cela.
1) Mettre de code ci-dessous dans web.xml de votre dossier de déploiement :
2) Vous pouvez également essayer d'utiliser HashLocationStrategy avec # dans l'URL pour les routes :
Essayez d'utiliser:
RouterModule.forRoot(routes, { useHash: true })
Au lieu de:
RouterModule.forRoot(routes)
Avec HashLocationStrategy votre url va être comme:
http://localhost/#/route
3) Tomcat de Réécriture d'URL de Valve : Ré-écrire l'url à l'aide d'un serveur de configuration au niveau de la redirection index.html si la ressource n'est pas trouvée.
3.1) à l'Intérieur de répertoire META-INF de créer un fichier context.xml et copiez le contexte ci-dessous à l'intérieur.
3.2) à l'Intérieur de WEB-INF, de créer le fichier de réécriture.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 réécriture.config, copiez le contenu ci-dessous:
je Viens de l'ajouter .htaccess de la racine.
ici, j'ai juste ajouter un point '.'(répertoire parent) dans /index.html d' ./index.html
assurez-vous que votre index.html fichier dans le chemin de base est le répertoire principal de chemin et set de construction de projet.
Ce n'est pas la bonne réponse mais Sur d'actualisation vous pouvez rediriger tous morts, des appels à la page d'Accueil en sacrifiant une page 404, c'est un temporaire hack viens de relire la suite sur 404.html fichier
La meilleure solution de résoudre le "routeur-pas-de travail-sur-rechargement-le-navigateur" est que nous devrions utiliser le spa de l'automne dos. Si vous utilisez angular2 application avec asp.net de base, alors il nous faut défini sur "Démarrage.cs" de la page. en vertu de la MVC déroutes. Je joins le code.
2017-juillet-11: Puisque c'est lié à partir d'une question ayant ce problème, mais en utilisant Angulaire 2 avec de l'Électron, je vais ajouter ma solution ici.
Tout ce que j'avais à faire était de supprimer
<base href="./">
de mon index.html et de l'Électron commencé à recharger la page à nouveau avec succès.La réponse est assez délicat. Si vous utilisez un bon vieux Serveur Apache (ou IIS), vous obtenez le problème, car l'angle de pages n'existent pas pour de vrai. Ils sont "calculées" à partir de l'angle de la route.
Il existe plusieurs façons de résoudre le problème. La première consiste à utiliser la HashLocationStrategy offerts par Angulaire. Mais un signe fort est ajouté dans l'URL. C'est principalement pour assurer la compatibilité avec Angulaire 1 (je suppose). Le fait est que la partie après la forte n'est pas une partie de l'URL (le serveur résout la partie avant le signe"#"). Qui peut être parfait.
Ici une méthode améliorée (basé sur la 404 truc). Je suppose que vous avez un "distribué" de la version de votre angulaire de l'application (
ng build --prod
si vous utilisez Angulaires-CLI) et que vous accédez à des pages directement avec votre serveur et PHP est activé.Si votre site est basé sur les pages (WordPress par exemple) et vous n'avez qu'un dossier consacré à Angulaires (nommé "dist" dans mon exemple), vous pouvez faire quelque chose de bizarre, mais, à la fin, simple. Je suppose que vous avez stocké vos Angulaire pages dans "/dist" (avec la fonction
<BASE HREF="/dist/">
). Maintenant utiliser une redirection 404 et à l'aide de PHP.Dans votre configuration d'Apache (ou, dans le
.htaccess
fichier de votre angulaire du répertoire de l'application), vous devez ajouterErrorDocument 404 /404.php
L'404.php va commencer avec 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 erreur 404, la redirection est faite au script PHP. Nous venons de vérifier si la page est à l'intérieur de l'angle de répertoire de l'application. Si c'est le cas, nous venons de charger le index.html directement (sans redirection): il est nécessaire de conserver l'URL inchangé. Nous avons aussi changer le code HTTP de 404 à 200 (juste mieux pour les robots).
Que si la page n'existe pas dans l'angle de la demande? Et bien, nous utilisons le "catch all" de l'angle de routeur (voir Angulaire de la documentation du routeur).
Cette méthode fonctionne avec un intégré à l'Angulaire de l'application à l'intérieur d'un site web de base (je pense que ce sera le cas à l'avenir).
NOTES:
mod_redirect
(par la réécriture de l'Url) n'est pas du tout une bonne solution car les fichiers (comme des actifs) doivent être vraiment chargé, alors il est plus risqué que de simplement en utilisant le "pas trouvé" la solution.ErrorDocument 404 /dist/index.html
fonctionne, mais Apache est toujours de répondre avec un message d'erreur 404 du code (ce qui est mauvais pour les robots).Ce n'est pas une solution permanente au problème, mais plus comme une solution de contournement ou hack
J'ai eu ce même problème lors du déploiement de mon Angulaire Application à la gh-pages.
J'ai d'abord été accueillie avec 404 messages lors de l'actualisation de mes pages sur gh-pages.
Alors que ce que @gunter a souligné j'ai commencé à utiliser
HashLocationStrategy
qui a été fourni Angulaire 2 .Mais qui est venu avec son propre ensemble de problèmes de la
#
dans l'url, il était vraiment mauvais fait l'url look bizarre comme cettehttps://rahulrsingh09.github.io/AngularConcepts/#/faq
.J'ai commencé des recherches sur ce problème et suis tombé sur un blog. J'ai essayé de donner un coup de feu et il a travaillé .
Voici ce que j'ai fait comme indiqué dans ce blog.
Référence backalleycoder Grâce à @Daniel pour cette solution de contournement.
Maintenant l'URL ci-dessus modifications https://rahulrsingh09.github.io/AngularConcepts/faq
J'ai fixé ce (à l'aide de Java /Spring backend) par l'ajout d'un gestionnaire d'évènement qui correspond à tout ce que définis dans mon Angulaire routes, qui renvoie index.html au lieu d'une 404. Ce alors effectivement (re)démarre l'application et charge la page correcte. Moi aussi j'ai une 404 pour tout ce qui n'est pas pris par à cette.
Ajouter des importations:
Et dans NgModule fournisseur, ajouter:
Principal index.html Fichier de l'Application de modifier la base href aux
./index.html
de/
L'Application déployée sur n'importe quel serveur vous donnera une véritable url de la page qui peut être consulté à partir de n'importe quelle application externe.
Si vous utilisez un serveur web de nginx pour servir angulaire de votre application, vous avez juste à ajouter
try_files $uri $uri//index.html;
dans le bloc de serveur de fichier conf de nginx. Dans le cas d'ubuntu serveur, ce fichier est appelédefault.conf
et peut être trouvé à/etc/nginx/conf.d
Si vous utilisez Apache ou Nginx comme serveur, vous devez créer un .htaccess
Simon réponse était correct pour moi. J'ai ajouté ce code: