AngularJS – Pourquoi lors du changement d’adresse URL $ routeProvider ne semble pas fonctionner et j’obtiens une erreur 404

Mon $routeProvider est configuré comme ceci:

 teachApp.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { $routeProvider. when('/teach/', {templateUrl: 'views/login_view.html'}). when('https://stackoverflow.com/teach/overview', {templateUrl: 'views/overview_view.html'}). when('/teach/users', {templateUrl: 'views/users_view.html'}). otherwise({redirectTo: '/teach/'}); $locationProvider.html5Mode(true); }]); 

Dans l’application, si je clique sur un lien tel que Overview , la vue partielle s’affiche comme prévu. Toutefois, lorsque je modifie manuellement l’URL de la barre d’adresse sur exactement la même URL, je reçois une erreur 404. Est-ce que $routeProvider mal configuré?

J’utilise MAMP localhost avec l’URL racine de l’application étant http://localhost/teach/

Vous devez configurer votre apache pour redirect tous les chemins vers la racine .

Lorsque vous ouvrez directement http://localhost/teach/overview votre serveur Web tente de diffuser une page à partir d’un itinéraire non défini.

Lorsque, dans une application angular, vous cliquez sur un lien avec le chemin href de http://localhost/teach/overview , Angular intervient, et au lieu de laisser votre navigateur demander une page du serveur, il intercepte votre événement de clic et passe à votre routeProvider pour voir quelle vue côté client à afficher (c’est pourquoi ils l’appellent “applications à une page”). C’est pourquoi vos liens fonctionnent tant que vous essayez de ne pas les ouvrir directement.

A côté de la configuration d’Apache, vous pouvez également utiliser la balise de base avec la valeur href de /teach/ :

  

de sorte que vous ne puissiez pas restreindre votre routeProvider par un préfixe fixe:

 teachApp.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { $routeProvider. when('/', {templateUrl: 'views/login_view.html'}). when('/overview', {templateUrl: 'views/overview_view.html'}). when('/users', {templateUrl: 'views/users_view.html'}). otherwise({redirectTo: '/'}); $locationProvider.html5Mode(true); }]); 

Vous pouvez également utiliser # dans vos URL.

 http://localhost/teach/#/overview 

Cela n’enverra pas de demande au serveur et sera intercepté par le $ angular $ routeProvider.