J'apprends AngularJS et il y a une chose qui m'agace vraiment.
J'utilise $routeProvider
pour déclarer des règles de routage pour mon application:
$routeProvider.when('/test', {
controller: TestCtrl,
templateUrl: 'views/test.html'
})
.otherwise({ redirectTo: '/test' });
mais quand je navigue vers mon application dans le navigateur, je vois app/#/test
au lieu de app/test
.
Donc ma question est pourquoi AngularJS ajoute ce hachage #
aux URL? Y a-t-il une possibilité de l'éviter?
javascript
angularjs
pikkvile
la source
la source
Réponses:
En fait, vous avez besoin du # (hashtag) pour les navigateurs non HTML5.
Sinon, ils feront simplement un appel HTTP au serveur au href mentionné. Le # est un ancien court-circuit du navigateur qui ne déclenche pas la demande, ce qui permet à de nombreux frameworks js de créer leur propre réacheminement côté client en plus de cela.
Vous pouvez utiliser
$locationProvider.html5Mode(true)
pour indiquer à angular d'utiliser la stratégie HTML5 si elle est disponible.Voici la liste des navigateurs prenant en charge la stratégie HTML5: http://caniuse.com/#feat=history
la source
Si vous avez activé html5mode comme d'autres l'ont dit, et créez un
.htaccess
fichier avec le contenu suivant (ajustez selon vos besoins):Les utilisateurs seront dirigés vers votre application lorsqu'ils entreront un itinéraire approprié, et votre application lira l'itinéraire et les amènera à la "page" correcte à l'intérieur.
EDIT: assurez-vous simplement qu'aucun fichier ou nom de répertoire n'entre en conflit avec vos itinéraires.
la source
/about
la page échoue, sauf si j'y arrive via l'application.Permet d'écrire une réponse simple et courte
merci à @plus - pour avoir détaillé la réponse ci-dessus
la source
essayer
Plus d'informations sur $ locationProvider
Utilisation de $ location
la source
Les informations suivantes proviennent de:
https://scotch.io/quick-tips/pretty-urls-in-angularjs-removing-the-hashtag
Il est très facile d'obtenir des URL propres et de supprimer le hashtag de l'URL dans Angular.
Par défaut, AngularJS acheminera les URL avec un hashtag Par exemple:
http://www.example.com
http://www.example.com/#/about
http://www.example.com/#/contact
Il y a 2 choses à faire.
Configuration de $ locationProvider
Définition de notre base pour les liens relatifs
$ location Service
Dans Angular, le service $ location analyse l'URL dans la barre d'adresse et apporte des modifications à votre application et vice versa.
Je recommande fortement de lire les documents officiels de localisation Angular $ pour avoir une idée du service de localisation et de ce qu'il propose.
https://docs.angularjs.org/api/ng/service/$location
$ locationProvider et html5Mode
Nous le ferons lors de la définition de votre application angulaire et de la configuration de vos itinéraires.
Qu'est-ce que l'API HTML5 History? Il s'agit d'un moyen standardisé de manipuler l'historique du navigateur à l'aide d'un script. Cela permet à Angular de modifier le routage et les URL de nos pages sans actualiser la page. Pour plus d'informations à ce sujet, voici un bon article sur l'API HTML5 History:
http://diveintohtml5.info/history.html
Définition de liens relatifs
<base>
dans le<head>
de votre document. Cela peut être dans le fichier racine index.html de votre application Angular. Recherchez la<base>
balise et définissez-la sur l'URL racine que vous souhaitez pour votre application.Par exemple:
<base href="https://stackoverflow.com/">
Remplacement pour les anciens navigateurs
En conclusion
la source
Si vous souhaitez configurer cela localement sur OS X 10.8 servant Angular avec Apache, vous trouverez peut-être ce qui suit dans votre fichier .htaccess:
Les options + FollowSymlinks, si elles ne sont pas définies, peuvent vous donner une erreur interdite dans les journaux comme ceci:
La réécriture de la base est requise, sinon les demandes seront résolues à la racine de votre serveur qui, par défaut, n'est pas votre répertoire de projet sauf si vous avez spécifiquement configuré vos vhosts, vous devez donc définir le chemin afin que la demande trouve votre répertoire racine de projet. Par exemple sur ma machine j'ai un répertoire / Users / me / Sites où je garde tous mes projets. Comme l'ancien OS X configuré.
Les deux lignes suivantes indiquent effectivement si le chemin n'est pas un répertoire ou un fichier, vous devez donc vous assurer que vous n'avez pas de fichiers ou de répertoires identiques à ceux de vos chemins de routage d'application.
La condition suivante indique si la demande ne se termine pas avec les extensions de fichier spécifiées, alors ajoutez ce dont vous avez besoin
Et le [L] dernier dit de servir le fichier index.html - votre application pour toutes les autres demandes.
Si vous avez toujours des problèmes, consultez le journal d'apache, il vous donnera probablement des conseils utiles:
la source
L'utilisation du mode HTML5 nécessite une réécriture d'URL côté serveur, vous devez essentiellement réécrire tous vos liens vers le point d'entrée de votre application (par exemple index.html). L'exigence d'une
<base>
balise est également importante dans ce cas, car elle permet à AngularJS de différencier la partie de l'URL qui est la base de l'application et le chemin qui doit être géré par l'application. Pour plus d'informations, consultez le Guide du développeur AngularJS - Utilisation du mode serveur $ location HTML5 côté serveur .Mettre à jour
Comment: configurer votre serveur pour qu'il fonctionne avec html5Mode 1
Lorsque vous avez activé html5Mode, le
#
caractère ne sera plus utilisé dans vos URL. Le#
symbole est utile car il ne nécessite aucune configuration côté serveur. Sans#
, l'url semble beaucoup plus agréable, mais elle nécessite également des réécritures côté serveur. Voici quelques exemples:Apache réécrit
Nginx réécrit
Réécriture d'Azure IIS
Réécritures express
Voir également
la source
Dans Angular 6, avec votre routeur, vous pouvez utiliser:
la source
Vous pouvez également utiliser le code ci-dessous pour rediriger vers la page principale (accueil):
Après avoir spécifié votre redirection comme ci-dessus, vous pouvez rediriger les autres pages, par exemple:
la source
**
** Parce que
la source