Pourquoi AngularJS double-t-il la chaîne de requête dans mon parcours?

J'utilise la navigation basée sur hash dans mon application AngularJS enracinée dans / .

Si un utilisateur navigue vers mon application comme ceci:

http://example.com/?foo

Un moment après la chargement de la page, quelque chose (éventuellement Angulaire) fait que la barre d'adresse semble différente de ce que je m'attendais.

Ce que j'ai vu:

http://example.com/?foo#/?foo

Ce que je m'attendais à voir:

http://example.com/?foo#/

Pourquoi cela se passe-t-il, et puis-je l'éteindre?

Je parie que vous devez être en mode "html5" pour ne pas avoir le fragment de hash … même si je suis incertain.

http://docs.angularjs.org/guide/dev_guide.services . $ Location

 $locationProvider.html5Mode(true).hashPrefix('!'); 

Dans la configuration de votre application, vous pouvez vous occuper de ce param de param et il pourrait probablement s'en débarrasser.

Cela semble être la duplication du hash avec le chemin.

Consultez le service de location de $. Il comporte les méthodes chemin () et hash (). La deuxième partie dupliquée est le hash, la première partie est le chemin.

Sauf si vous utilisez le mode html5, toute la partie de l'URL d'Angular apparaît dans le fragment. Le problème est que Angular ne connaît pas la base de l'URL (peut-être que le "foo" était nécessaire pour obtenir Angular à charger) afin qu'il ne tente pas de le manipuler, il met ses propres éléments sous forme de fragment .

Je suggère que la meilleure chose serait de vérifier $window.location.search pour une chaîne de requête, et si vous en pensez, redirigez-vous vers l'URL que vous voulez réellement. Vous devrez toujours effectuer cette redirection en affectant à $window.location plutôt qu'en $location et cela obligera votre application angulaire à recharger, mais au moins, vous allez finir par arriver.

Alternativement, vous pouvez reconfigurer votre serveur Web pour effectuer la réécriture appropriée, mais vous ne voulez peut-être pas ou ne pouvez pas le faire.

Ou dites-leur à vos utilisateurs d'utiliser uniquement les URL qu'ils ont obtenues de l'application, et non d'essayer de les inventer eux-mêmes.