Ich hatte den Eindruck, dass Angular URLs, die in href-Attributen von Ankertags innerhalb von Tempaltes erscheinen, so umschreiben würde, dass sie im HTML5-Modus oder im Hashbang-Modus funktionieren würden. Die Dokumentation für den Ortungsdienst scheint zu sagen, dass HTML Link Rewriting sich um die Hashbang-Situation kümmert. Ich würde daher erwarten, dass Hashes eingefügt werden, wenn sie sich nicht im HTML5-Modus befinden, und im HTML5-Modus nicht.
Es scheint jedoch, dass kein Umschreiben stattfindet. Im folgenden Beispiel kann ich den Modus nicht einfach ändern. Alle Links in der Anwendung müssten von Hand neu geschrieben werden (oder zur Laufzeit von einer Variablen abgeleitet werden. Muss ich je nach Modus alle URLs manuell neu schreiben?
In Angular 1.0.6, 1.1.4 oder 1.1.3 wird keine clientseitige URL-Umschreibung durchgeführt. Es scheint, dass allen href-Werten # / für den Hashbang-Modus und / für den HTML5-Modus vorangestellt werden muss.
Ist eine Konfiguration erforderlich, um das Umschreiben zu veranlassen? Verstehe ich die Dokumente falsch? Etwas anderes Dummes tun?
Hier ist ein kleines Beispiel:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Nachtrag: Beim erneuten Lesen meiner Frage sehe ich, dass ich den Begriff "Umschreiben" verwendet habe, ohne viel Klarheit darüber zu haben, wer und wann ich das Umschreiben durchführen wollte. Die Frage ist, wie Angular dazu gebracht werden kann, die URLs beim Rendern von Pfaden neu zu schreiben, und wie Pfade im JS-Code in beiden Modi einheitlich interpretiert werden können. Es geht nicht darum, wie ein Webserver HTML5-kompatibles Umschreiben von Anforderungen veranlasst.
quelle
Antworten:
Die Dokumentation zum AngularJS-Routing ist nicht sehr klar. Es geht um den Hashbang- und HTML5-Modus. Tatsächlich arbeitet AngularJS-Routing in drei Modi:
Für jeden Modus gibt es eine entsprechende LocationUrl-Klasse (LocationHashbangUrl, LocationUrl und LocationHashbangInHTML5Url).
Um das Umschreiben von URLs zu simulieren, müssen Sie html5mode auf true setzen und die $ sniffer-Klasse wie folgt dekorieren:
Ich werde dies nun genauer erklären:
Hashbang-Modus
Aufbau:
Dies ist der Fall, wenn Sie URLs mit Hashes in Ihren HTML-Dateien verwenden müssen, z
Im Browser müssen Sie den folgenden Link verwenden:
http://www.example.com/base/index.html#!/base/path
Wie Sie im reinen Hashbang-Modus sehen können, müssen alle Links in den HTML-Dateien mit der Basis wie "index.html #!" Beginnen.
HTML5-Modus
Aufbau:
Sie sollten die Basis in HTML-Datei setzen
In diesem Modus können Sie Links ohne das # in HTML-Dateien verwenden
Link im Browser:
Hashbang im HTML5-Modus
Dieser Modus wird aktiviert, wenn wir tatsächlich den HTML5-Modus verwenden, jedoch in einem inkompatiblen Browser. Wir können diesen Modus in einem kompatiblen Browser simulieren, indem wir den $ sniffer-Dienst dekorieren und den Verlauf auf false setzen.
Aufbau:
Setze die Basis in HTML-Datei:
In diesem Fall können die Links auch ohne den Hash in der HTML-Datei geschrieben werden
Link im Browser:
quelle
$provide
ist undefiniert?Für zukünftige Leser, wenn Sie Angular 1.6 verwenden , müssen Sie auch Folgendes ändern
hashPrefix
:Vergessen Sie nicht, die Basis in Ihrem HTML festzulegen
<head>
:Weitere Infos zum Changelog here.
quelle
Es hat eine Weile gedauert, bis ich herausgefunden habe, wie ich es zum Laufen gebracht habe - Angular WebAPI ASP Routing ohne das # für SEO
Add $ locationProvider.html5Mode (true); zu app.config
Ich brauchte einen bestimmten Controller (der sich im Home-Controller befand), der beim Hochladen von Bildern ignoriert werden musste, also habe ich diese Regel zu RouteConfig hinzugefügt
Fügen Sie in Global.asax Folgendes hinzu: Wenn Sie die API- und Bild-Upload-Pfade ignorieren, funktionieren sie wie gewohnt, andernfalls leiten Sie alles andere um.
Stellen Sie sicher, dass Sie $ location.url ('/ XXX') und nicht window.location ... verwenden, um umzuleiten
Verweisen Sie auf die CSS-Dateien mit dem absoluten Pfad
und nicht
Letzte Anmerkung - auf diese Weise hatte ich die volle Kontrolle und musste nichts an der Webkonfiguration tun.
Ich hoffe, das hilft, da ich eine Weile gebraucht habe, um das herauszufinden.
quelle
Ich wollte in der Lage sein, mit dem HTML5-Modus und einem festen Token auf meine Anwendung zuzugreifen und dann zur Hashbang-Methode zu wechseln (um das Token beizubehalten, damit der Benutzer seine Seite aktualisieren kann).
URL für den Zugriff auf meine App:
http://myapp.com/amazing_url?token=super_token
Wenn der Benutzer die Seite lädt:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Wenn der Benutzer dann navigiert:
http://myapp.com/amazing_url?token=super_token#/another_url
Damit behalte ich das Token in der URL und den Status, wenn der Benutzer surft. Ich habe die Sichtbarkeit der URL ein wenig verloren, aber es gibt keine perfekte Möglichkeit, dies zu tun.
Aktivieren Sie also nicht den HTML5-Modus und fügen Sie dann diesen Controller hinzu:
quelle