Ich möchte den HTML5-Modus für meine App aktivieren. Ich habe den folgenden Code für die Konfiguration eingegeben, wie hier gezeigt :
return app.config(['$routeProvider','$locationProvider', function($routeProvider,$locationProvider) {
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix = '!';
$routeProvider.when('/', {
templateUrl: '/views/index.html',
controller: 'indexCtrl'
});
$routeProvider.when('/about',{
templateUrl: '/views/about.html',
controller: 'AboutCtrl'
});
Wie Sie sehen können, habe ich das verwendet $locationProvider.html5mode
und alle meine Links am geändert ng-href
, um das auszuschließen /#/
.
Das Problem
Im Moment kann ich auf localhost:9000/
die Indexseite gehen und zu den anderen Seiten wie navigieren localhost:9000/about
.
Das Problem tritt jedoch auf, wenn ich die localhost:9000/about
Seite aktualisiere . Ich erhalte folgende Ausgabe:Cannot GET /about
Wenn ich mir die Netzwerkaufrufe ansehe:
Request URL:localhost:9000/about
Request Method:GET
Wenn ich zum ersten Mal gehe localhost:9000/
und dann auf eine Schaltfläche klicke, die zu navigiert, /about
erhalte ich:
Request URL:http://localhost:9000/views/about.html
Das macht die Seite perfekt.
Wie kann ich Angular aktivieren, um beim Aktualisieren die richtige Seite zu erhalten?
quelle
Antworten:
Aus den eckigen Dokumenten
Der Grund dafür ist, dass
/about
der Browser beim ersten Besuch der Seite ( ), z. B. nach einer Aktualisierung, nicht wissen kann, dass es sich nicht um eine echte URL handelt. Daher wird diese fortgeführt und geladen. Wenn Sie jedoch zuerst die Stammseite und den gesamten Javascript-Code geladen haben, können Sie beim Navigieren zu/about
Angular dort hineinkommen, bevor der Browser versucht, den Server zu erreichen und entsprechend zu behandelnquelle
$routeProvider
und die Wege jedes einzelnen ändern muss,templateUrl
z. B. vontemplateUrl : '/views/about.html',
nachtemplateUrl : 'example.com/views/about.html',
?Es müssen nur wenige Dinge eingerichtet werden, damit Ihr Link im Browser so aussieht,
http://yourdomain.com/path
und dies ist Ihre eckige Konfigurations- + Serverseite1) AngularJS
2) Server-Seite, legen
.htaccess
Sie es einfach in Ihrem Stammordner ab und fügen Sie diesen einWeitere interessante Informationen zum HTML5-Modus in AngularJS und zur Konfiguration, die für verschiedene Umgebungen erforderlich ist: https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-configure-your-server -to-work-with-html5mode Auch diese Frage kann Ihnen helfen, $ location / umschalten zwischen html5 und Hashbang-Modus / Link-Umschreiben
quelle
Ich hatte ein ähnliches Problem und löste es durch:
Verwendung
<base href="https://stackoverflow.com/index.html">
auf der IndexseiteVerwenden Sie eine Catch-All-Route-Middleware in meinem Knoten / Express-Server wie folgt (setzen Sie sie hinter den Router):
Ich denke, das sollte dich zum Laufen bringen.
Wenn Sie einen Apache-Server verwenden, möchten Sie möglicherweise Ihre Links mod_rewrite. Es ist nicht schwer zu tun. Nur ein paar Änderungen in den Konfigurationsdateien.
Alles, was vorausgesetzt wird, dass Sie html5mode für anglejs aktiviert haben. Jetzt. Beachten Sie, dass in Winkel 1.2 das Deklarieren einer Basis-URL eigentlich nicht mehr empfohlen wird.
quelle
<base href="https://stackoverflow.com/">
und dem Hinzufügen des von Ihnen vorgeschlagenen Express-Routings. Vielen Dank.<base href="https://stackoverflow.com/index.html">
?Lösung für BrowserSync und Gulp.
Von https://github.com/BrowserSync/browser-sync/issues/204#issuecomment-102623643
Erste Installation
connect-history-api-fallback
:Dann füge es deiner gulpfile.js hinzu:
quelle
server: { ... }, port: 8100
fügen Sie dieserve
Aufgabe einfach Ihrer Standard-Gulp-Aufgabe (dhgulp.task('default', ['sass', 'serve']);
) hinzu, und Sie können die App ausführen ohne dieCannot GET ...
Browserfehler, wenn Sie die Seite durch Ausführen aktualisierengulp
. Beachten Sie, dass beim Ausführen des Serversionic serve
immer noch die Fehler auftreten.Sie müssen Ihren Server so konfigurieren, dass alles in index.html umgeschrieben wird, um die App zu laden:
https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#wiki-how-to-configure-your-server-to-work-with-html5mode
quelle
try_files $uri $uri/ /index.php?...
anstelle der benötigten hatteindex.html
. Danke für den Link!Ich habe eine einfache Connect-Middleware geschrieben, um das Umschreiben von URLs in Grunzprojekten zu simulieren. https://gist.github.com/muratcorlu/5803655
Sie können so verwenden:
quelle
$routeProvider
?urlRewrite
Beim Versuch, es auszuführen , wird keine definierte Warnung angezeigt, und es fällt mir schwer, die richtige Verbindung zum Umschreiben zu finden, die ich verwenden kann.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 in der Seitenaktualisierung "yoursite.com/about" befinden, erhalten Sie 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 URLs abfängt
quelle
IIS URL Rewrite Rule, um 404-Fehler nach der Seitenaktualisierung im HTML5-Modus zu vermeiden
Für eckige Ausführung unter IIS unter Windows
NodeJS / ExpressJS-Routen zur Verhinderung von 404-Fehlern nach Seitenaktualisierung im HTML5-Modus
Für Winkellauf unter Node / Express
Weitere Informationen unter: AngularJS - Aktivieren der Seitenaktualisierung im HTML5-Modus ohne 404-Fehler in NodeJS und IIS
quelle
Wie bereits erwähnt, müssen Sie Routen auf dem Server neu schreiben und festlegen
<base href="https://stackoverflow.com/"/>
.Für
gulp-connect
:npm install connect-pushstate
quelle
Ich verwende Apache (xampp) in meiner Entwicklungsumgebung und Apache in der Produktion. Fügen Sie hinzu:
Um den .htaccess für mich dieses Problem zu lösen.
quelle
Für Grunt und Browsersync verwenden connect-modrewrite hier
quelle
npm install connect-modrewrite --save
2.require in gruntfile
3. Kopieren Sie das obige ServerobjektIch habe es gelöst
quelle
Ich beantworte diese Frage aus der größeren Frage:
Wenn Sie html5Mode aktiviert haben, wird das Zeichen # nicht mehr in Ihren URLs verwendet. Das Symbol # ist nützlich, da keine serverseitige Konfiguration erforderlich ist. Ohne # sieht die URL viel besser aus, erfordert aber auch serverseitige Umschreibungen. Hier sind einige Beispiele:
Für Express-Umschreibungen mit AngularJS können Sie dies mit den folgenden Updates lösen:
und
und
quelle
Ich glaube, Ihr Problem betrifft den Server. In der eckigen Dokumentation zum HTML5-Modus (unter dem Link in Ihrer Frage) heißt es:
Serverseite Wenn Sie diesen Modus verwenden, müssen Sie die URL auf der Serverseite neu schreiben. Grundsätzlich müssen Sie alle Links zum Einstiegspunkt Ihrer Anwendung (z. B. index.html) neu schreiben.
Ich glaube, Sie müssen eine URL-Umschreibung von / about nach / einrichten.
quelle
Wir hatten eine Serverumleitung in Express:
und wir bekamen immer noch Probleme mit der Seitenaktualisierung, selbst nachdem wir das hinzugefügt hatten
<base href="https://stackoverflow.com/" />
.Lösung: Stellen Sie sicher, dass Sie zum Navigieren echte Links auf Ihrer Seite verwenden. Geben Sie die Route nicht in die URL ein, sonst erhalten Sie eine Seitenaktualisierung. (dummer Fehler, ich weiß)
:-P
quelle
Endlich habe ich eine Möglichkeit, dieses Problem auf der Serverseite zu lösen, da es eher ein Problem mit AngularJs selbst ist. Ich verwende 1,5 Angularjs und habe das gleiche Problem beim erneuten Laden der Seite. Aber nachdem ich den folgenden Code in meine
server.js
Datei eingefügt habe , ist es mein Tag, aber es ist keine richtige Lösung oder kein guter Weg.quelle
Ich habe ein noch besseres Grunt-Plugin gefunden, das funktioniert, wenn Sie Ihre index.html und Gruntfile.js im selben Verzeichnis haben.
Danach in deinem Gruntfile:
quelle
quelle
Ich hatte das gleiche Problem mit der mit JHipster generierten Java + Angular App . Ich habe es mit Filter und Liste aller eckigen Seiten in Eigenschaften gelöst:
application.yml:
AngularPageReloadFilter.java
WebConfigurer.java
Hoffe, es wird für jemanden hilfreich sein.
quelle
Gulp + browserSync:
Installieren Sie connect-history-api-fallback über npm und konfigurieren Sie später Ihre Serve-Gulp-Aufgabe
quelle
Ihr serverseitiger Code lautet JAVA. Führen Sie dann die folgenden Schritte aus
Schritt 1: Download urlrewritefilter JAR Klicken Sie hier und speichern Sie, um den Pfad WEB-INF / lib zu erstellen
Schritt 2: Aktivieren Sie den HTML5-Modus $ locationProvider.html5Mode (true);
Schritt 3: Basis-URL festlegen
<base href="https://stackoverflow.com/example.com/"/>
Schritt 4: Kopieren und Einfügen in Ihre WEB.XML
Schritt 5: Erstellen Sie eine Datei in WEN-INF / urlrewrite.xml
quelle
Ich habe diese einfache Lösung, die ich verwendet habe, und ihre Funktionen.
In App / Exceptions / Handler.php
Fügen Sie dies oben hinzu:
Dann innerhalb der Rendermethode
quelle
Ich habe das Problem behoben, indem ich das folgende Codeausschnitt in die Datei node.js eingefügt habe.
Hinweis: Wenn wir die Seite aktualisieren, wird nach der API anstelle der Angular-Seite gesucht (da die URL kein # -Tag enthält). Mit dem obigen Code leite ich mit # zur URL um
quelle
Schreiben Sie einfach eine Regel in web.config
Fügen Sie dies im Index hinzu
es funktioniert bei mir, vielleicht haben Sie vergessen, Html5Mode app.config festzulegen
quelle