$ location / Wechsel zwischen html5 und hashbang mode / link rewriting

174

Ich hatte den Eindruck, dass Angular URLs neu schreiben würde, die in href-Attributen von Anchor-Tags in tempentes erscheinen, so dass sie funktionieren würden, egal ob im HTML5-Modus oder im Hashbang-Modus. Die Dokumentation für den Ortungsdienst scheint zu sagen, dass HTML Link Rewriting sich um die Hashbang-Situation kümmert. Ich würde also erwarten, dass, wenn nicht im HTML5-Modus, Hashes eingefügt werden, und im HTML5-Modus würden sie nicht.

Es scheint jedoch, dass kein Neuschreiben 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 alle URLs je nach Modus manuell neu schreiben?

)

Ich sehe keine clientseitige URL-Umschreibung in Angular 1.0.6, 1.1.4 oder 1.1.3. Es scheint, dass alle href-Werte mit # / für den Hashbang-Modus und / für den HTML5-Modus vorangestellt werden müssen.

Gibt es eine Konfiguration, die zum Umschreiben erforderlich ist? Lese ich die Dokumente falsch? Etwas anderes tun, albern?

Hier ist ein kleines Beispiel:

%Vor%

Nachtrag: Wenn ich meine Frage noch einmal durchlese, sehe ich, dass ich den Begriff "Umschreiben" verwendet habe, ohne Klarheit darüber zu haben, wer und wann ich das Neuschreiben machen wollte. Die Frage ist, wie man Angular die URLs neu schreiben kann, wenn es Pfade rendert und wie man Pfade im JS-Code gleichmäßig über die beiden Modi interpretiert. Es ist nicht darüber, wie ein Webserver HTML5-kompatibles Neuschreiben von Anfragen durchführen kann.

    
laurelnaiad 21.05.2013, 19:00
quelle

4 Antworten

353

Die Dokumentation zum AngularJS-Routing ist nicht sehr klar. Es spricht über Hashbang und HTML5-Modus. Tatsächlich funktioniert das AngularJS-Routing in drei Modi:

  • Hashbang-Modus
  • HTML5-Modus
  • Hashbang im HTML5-Modus

Für jeden Modus gibt es eine entsprechende LocationUrl-Klasse (LocationHashbangUrl, LocationUrl und LocationHashbangInHTML5Url).

Um URL-Neuschreiben zu simulieren, müssen Sie html5mode auf true setzen und die $ -Sniffer-Klasse wie folgt dekorieren:

%Vor%

Ich werde das jetzt genauer erklären:

Hashbang-Modus

Konfiguration:

%Vor%

Dies ist der Fall, wenn Sie URLs mit Hashes in Ihren HTML-Dateien wie in

verwenden müssen %Vor%

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

Konfiguration:

%Vor%

Sie sollten die Basis in HTML-Datei

festlegen %Vor%

In diesem Modus können Sie Links ohne # in HTML-Dateien verwenden

%Vor%

Link im Browser:

%Vor%

Hashbang im HTML5-Modus

Dieser Modus ist aktiviert, wenn wir 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.

Konfiguration:

%Vor%

Setze die Basis in HTML-Datei:

%Vor%

In diesem Fall können die Links auch ohne den Hash in der HTML-Datei

geschrieben werden %Vor%

Link im Browser:

%Vor%     
jupiter 21.05.2013, 19:34
quelle
7

Für zukünftige Leser sollten Sie, wenn Sie Angular 1.6 verwenden, auch hashPrefix :

ändern %Vor%

Vergessen Sie nicht, die Basis in Ihrem HTML <head> :

zu setzen %Vor%

Weitere Informationen zum Änderungsprotokoll hier .

    
Mistalis 22.03.2017 08:45
quelle
0

Das hat eine Weile gedauert, bis ich herausgefunden habe, dass dies funktioniert - Angular WebAPI ASP Routing ohne # für SEO

  1. zu Index.html hinzufügen - base href="/" & gt;
  2. Hinzufügen $ locationProvider.html5Mode (true); zu app.config

  3. Ich brauchte einen bestimmten Controller (der im Home-Controller war), der ignoriert werden sollte, um Bilder hochzuladen, also fügte ich diese Regel zu RouteConfig hinzu

    %Vor%
  4. Fügen Sie in Global.asax Folgendes hinzu: Stellen Sie sicher, dass API- und Bild-Upload-Pfade ignoriert werden, damit sie wie gewohnt funktionieren, andernfalls leiten Sie alles andere um.

    %Vor%
  5. Stellen Sie sicher, dass Sie $ location.url ('/ XXX') und nicht window.location ... verwenden, um

  6. umzuleiten
  7. Verweisen Sie die CSS-Dateien mit dem absoluten Pfad

und nicht

%Vor%

Schlussbemerkung - auf diese Weise gab mir die volle Kontrolle und ich musste nichts mit der Web-Konfiguration machen.

Ich hoffe, das hilft, da ich eine Weile gebraucht habe, um es herauszufinden.

    
tfa 07.11.2015 15:15
quelle
0

Ich wollte mit dem HTML5-Modus und einem festen Token auf meine Anwendung zugreifen und dann zur Hashbang-Methode 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

Dann, 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 behalte den Status beim Browsen des Benutzers. Ich habe ein wenig Sichtbarkeit der URL verloren, aber es gibt keine perfekte Möglichkeit, dies zu tun.

Aktivieren Sie also nicht den HTML5-Modus und fügen Sie diesen Controller hinzu:

%Vor%     
Luc Boissaye 22.10.2015 08:53
quelle

Tags und Links