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.