Ist es möglich, das Symbol # aus den URLs von angle.js zu entfernen?
Ich möchte weiterhin die Zurück-Schaltfläche des Browsers usw. verwenden können, wenn ich die Ansicht ändere und die URL mit Parametern aktualisiere, aber ich möchte nicht das # -Symbol.
Das Tutorial routeProvider wird wie folgt deklariert:
angular.module('phonecat', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl}).
when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
otherwise({redirectTo: '/phones'});
}]);
Kann ich dies bearbeiten, um die gleiche Funktionalität ohne das # zu haben?
Antworten:
Ja, Sie sollten konfigurieren
$locationProvider
und einstellenhtml5Mode
auftrue
:quelle
html5Mode(true)
. Im IE müssen Sie#
in Routen verwenden.IE lt 10
bedeutet Internet Explorer weniger als Version 10$locationProvider.html5Mode(true);
inif !(IE lt 10)
?Überprüfen Sie unbedingt die Browserunterstützung für die HTML5-Verlaufs-API:
quelle
If the HTML5 History API is not supported by a browser, the $location service will fall back to using the hashbang URLs automatically
Um das Hash-Tag für eine hübsche URL zu entfernen und damit Ihr Code nach der Minimierung funktioniert , müssen Sie Ihren Code wie im folgenden Beispiel strukturieren:
quelle
requireBase: false
+1$locationProvider.html5Mode
Code$urlRouterProvider.otherwise('/home');
funktionierte mein Code nicht mehr.Ich schreibe eine Regel in web.config, nachdem sie
$locationProvider.html5Mode(true)
eingestellt wurdeapp.js
.Hoffe, hilft jemandem aus.
In meiner index.html habe ich dies hinzugefügt
<head>
Vergessen Sie nicht, URL Rewriter für iis auf dem Server zu installieren.
Auch wenn Sie Web-API und IIS verwenden, funktioniert diese Übereinstimmungs-URL nicht, da sie Ihre API-Aufrufe ändert. Fügen Sie also die dritte Eingabe (dritte Bedingungszeile) hinzu und geben Sie ein Muster aus, von dem Anrufe ausgeschlossen werden
www.yourdomain.com/api
quelle
Wenn Sie sich im .NET-Stack mit MVC mit AngularJS befinden, müssen Sie Folgendes tun, um das '#' aus der URL zu entfernen:
Richten Sie Ihre Basis-HREF auf Ihrer _Layout-Seite ein:
<head> <base href="https://stackoverflow.com/"> </head>
Fügen Sie dann Folgendes in Ihre eckige App-Konfiguration ein:
$locationProvider.html5Mode(true)
Oben wird '#' aus der URL entfernt, aber die Seitenaktualisierung funktioniert nicht, z. B. wenn Sie sich auf der Seite "yoursite.com/about" befinden. Refreash gibt Ihnen eine 404. Dies liegt daran, dass MVC das Winkelrouting und das MVC-Muster nicht kennt sucht nach einer MVC-Seite für 'about', die im MVC-Routing-Pfad nicht vorhanden ist. Um dieses Problem zu umgehen, senden Sie alle MVC-Seitenanforderungen an eine einzelne MVC-Ansicht. Sie können dies tun, indem Sie eine Route hinzufügen, die alle abfängt
URL:
quelle
Sie können den HTML5-Modus optimieren, dies funktioniert jedoch nur für Links, die in HTML-Ankern Ihrer Seite enthalten sind und wie die URL in der Adressleiste des Browsers aussieht. Der Versuch, eine Unterseite ohne Hashtag (mit oder ohne html5mode) von einer beliebigen Stelle außerhalb der Seite anzufordern, führt zu einem 404-Fehler. Beispielsweise führt die folgende CURL-Anforderung unabhängig vom HTML5-Modus zu einem Fehler, bei dem die Seite nicht gefunden wurde:
obwohl das Folgende die Stamm- / Homepage zurückgibt:
Der Grund dafür ist, dass alles, was nach dem Hashtag entfernt wurde, bevor die Anforderung auf dem Server eintrifft. Eine Anfrage für
http://foo.bar/#/portfolio
kommt also als Anfrage für auf dem Server anhttp://foo.bar
. Der Server antwortet (vermutlich) mit 200 OKhttp://foo.bar
und der Agent / Client verarbeitet den Rest.In Fällen, in denen Sie eine URL mit anderen teilen möchten, haben Sie keine andere Wahl, als das Hashtag einzuschließen.
quelle
Befolgen Sie zwei Schritte:
1. Legen Sie zuerst den $ locationProvider.html5Mode (true) in Ihrer App-Konfigurationsdatei fest.
Zum Beispiel -
angular.module('test', ['ui.router']) .config(function($stateProvider, $urlRouterProvider, $locationProvider) { $locationProvider.html5Mode(true); $urlRouterProvider.otherwise('/'); });
2.Setzen Sie die <Basis> auf Ihrer Hauptseite.
Zum Beispiel ->
<base href="https://stackoverflow.com/">
Der $ location-Dienst greift automatisch auf die Hash-Part-Methode für Browser zurück, die die HTML5-Verlaufs-API nicht unterstützen.
quelle
Meine Lösung besteht darin, .htaccess zu erstellen und # Sorian-Code zu verwenden. Ohne .htaccess konnte ich # nicht entfernen.
quelle
Laut Dokumentation. Sie können verwenden:
Zum Beispiel: Wenn Sie klicken auf:
<a href="https://stackoverflow.com/other">Some URL</a>
Im HTML5-Browser : Angular leitet automatisch zu weiter
example.com/other
In Not HTML5 Browser : Angular leitet automatisch zu weiter
example.com/#!/other
quelle
Bei dieser Antwort wird davon ausgegangen, dass Sie nginx als Reverse-Proxy verwenden und $ locationProvider.html5mode bereits auf true gesetzt haben.
-> Für die Leute, die immer noch mit all den coolen Sachen oben zu kämpfen haben.
Sicherlich funktioniert die @ maxim-Grach-Lösung einwandfrei, aber für die Lösung, wie auf Anfragen reagiert werden soll, bei denen das Hashtag überhaupt nicht enthalten sein soll, müssen Sie überprüfen, ob PHP 404 sendet, und dann die URL neu schreiben. Es folgt der Code für Nginx:
Erkennen Sie am PHP-Speicherort einen 404-PHP-Fehler und leiten Sie ihn an einen anderen Speicherort weiter.
Schreiben Sie dann die URL an der Umleitungsposition neu und geben Sie die Daten an proxy_pass weiter. Setzen Sie die URL Ihrer Website an die Stelle der URL meines Blogs. (Anfrage: Frage dies erst, nachdem du es versucht hast)
Und sieh die Magie.
Und es funktioniert definitiv, zumindest für mich.
quelle
Beginnen Sie mit index.html. Entfernen Sie alles
#
aus,<a href="#/aboutus">About Us</a>
damit es wie<a href="https://stackoverflow.com/aboutus">About Us</a>
folgt aussieht. Schreiben Sie jetzt im head-Tag von index.html<base href="https://stackoverflow.com/">
direkt nach dem letzten Meta-Tag .Jetzt in Ihr Routing js injizieren
$locationProvider
und schreiben Sie so$locatonProvider.html5Mode(true);
etwas: -Weitere Details finden Sie in diesem Video unter https://www.youtube.com/watch?v=XsRugDQaGOo
quelle
Ich denke, das ist wirklich spät dafür. Das Hinzufügen der folgenden Konfiguration zu den app.module-Importen erledigt jedoch die Aufgabe:
quelle
Schritt 1: Injizieren Sie den Dienst $ locationProvider in den Konstruktor der App-Konfiguration
Schritt 2: Fügen Sie dem Konstruktor der App-Konfiguration die Codezeile $ locationProvider.html5Mode (true) hinzu.
Schritt 3: Fügen Sie auf der Containerseite (Landing, Master oder Layout) ein HTML-Tag hinzu, z. B.
<base href="https://stackoverflow.com/">
innerhalb des Tags.Schritt 4: Entfernen Sie alle '# "für das Routing der Konfiguration von allen Ankertags. Beispielsweise wird href =" # home "zu href =" home "; href =" # about "wird zu herf =" about "; href =" # contact "wird href =" Kontakt "
quelle
Fügen Sie einfach
$locationProvider
inund dann
$locationProvider.hashPrefix('');
nach hinzufügenDas ist es.
quelle