S3 Static Website Hosting Route Alle Pfade zu Index.html
Ich bin mit S3 zum hosten einer javascript-app, die mit HTML5 pushStates. Das problem ist, wenn der Benutzer Lesezeichen eine der URLs, es wird sich nicht auflösen, zu nichts. Was ich brauche, ist die Fähigkeit, alle url-Anforderungen und dienen bis die Wurzel index.html in meinem S3-bucket, anstatt nur tun, eine vollständige Umleitung. Dann meine javascript-Anwendung, die die URL analysiert und dienen der richtigen Seite.
Gibt es eine Möglichkeit zu sagen, S3 dienen die index.html für alle URL-Anfragen zu tun, anstatt Weiterleitungen? Dies wäre ähnlich wie das einrichten von apache, um alle eingehenden Anfragen mit einer einzigen index.html wie in diesem Beispiel: https://stackoverflow.com/a/10647521/1762614. Ich würde wirklich wie zu vermeiden, ein web-server läuft nur mit diesen Routen. Alles tun, von S3 ist sehr Ansprechend.
InformationsquelleAutor der Frage Mark Nutter | 2013-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mark-Lösung ist nicht schlecht, aber es gibt eine noch einfachere Lösung. In Ihrem Eimer Eigenschaften in der Fehler Dokument verwenden Sie einfach die gleiche Datei wie die Index Dokument. JavaScript-frameworks wie Backbone, AngularJS usw. funktionieren out of the box diese Weise und Aktualisierung der Seite wird vollständig unterstützt.
InformationsquelleAutor der Antwort Stefan
Dem Weg war ich in der Lage, diese zu arbeiten ist wie folgt:
In der Bearbeiten Umleitung Regeln Abschnitt der S3-Verwaltungskonsole für Ihre Domäne, fügen Sie den folgenden Regeln:
Dieser leitet alle Pfade, die im Ergebnis eine 404-nicht gefunden Sie Ihr root-domain mit einem hash-bang-version der Pfad. So http://yourdomainname.com/posts leiten zu http://yourdomainname.com/#!/Beiträge vorausgesetzt, es ist keine Datei unter /Beiträge.
Verwenden HTML5 pushStates jedoch, die wir brauchen, um diese Anforderung und manuell einrichten die richtige pushState basiert auf der hash-bang-Pfad. So fügen Sie diese an die Spitze der index.html Datei:
Dieser schnappt sich den hash und verwandelt es in einen HTML5 pushState. Von diesem Zeitpunkt an können Sie pushStates nicht-hash-bang-Pfade in Ihrem app.
InformationsquelleAutor der Antwort Mark Nutter
Es ist sehr einfach, es zu lösen, ohne die url-hacks, mit CloudFront helfen.
InformationsquelleAutor der Antwort lenaten
Gibt es einige Probleme mit dem S3/Redirect-basierten Ansatz von anderen erwähnt.
Die Lösung ist:
5.Für SEO muss + dafür, dass Ihre index.html nicht im cache, tun Sie den folgenden:
Ich helfen kann, die in mehr Einzelheiten mit Bezug auf nginx setup, nur eine Anmerkung hinterlassen. Gelernt haben die harte Tour.
Einmal der cloud-front-distribution aktualisieren. Erlöschen Ihrer cloudfront cache einmal in der unberührten Modus.
Schlagen Sie die url in den browser und alles sollte gut sein.
InformationsquelleAutor der Antwort moha297
Es ist tangential, aber hier ein Tipp für diejenigen, die sich mit Rackt ist Reagieren Router-Bibliothek mit (HTML5) browser-Geschichte, die wollen host on S3.
Angenommen, ein Benutzer besucht
/foo/bear
bei Ihrem S3 gehosteten statische web-site. Angesichts David ' s früher Vorschlag -, redirect-Regeln, senden Sie/#/foo/bear
. Wenn Ihre Anwendung gebaut mit der browser-Verlauf, das wird nicht viel gutes tun. Aber Ihre Anwendung wird geladen, an diesem Punkt, und es können nun manipulieren Geschichte.Einschließlich Rackt Geschichte in unserem Projekt (siehe auch Verwenden von Benutzerdefinierten Geschichten aus Reagieren die Router-Projekt), können Sie fügen Sie einen listener hinzu, dass die Kenntnis des hash-Geschichte-Pfade und ersetzen Sie den Pfad gegebenenfalls, wie in diesem Beispiel illustriert:
Zur Erinnerung:
/foo/bear
zu/#/foo/bear
.#/foo/bear
Geschichte notation.Link
- tags wie erwartet funktionieren wird, wie alle anderen browser-history-Funktionen. Der einzige Nachteil ich bemerkt habe, ist die interstitielle redirect erfolgt auf erste Anforderung.Diese war inspiriert durch eine Lösung für AngularJSund ich vermute, dass könnte leicht angepasst werden, um jede Anwendung.
InformationsquelleAutor der Antwort Michael Ahlers
Ich lief in das gleiche problem heute, aber die Lösung von @Mark-Nutter war unvollständig zu entfernen, die hashbang von meinem angularjs-Anwendung.
In der Tat, Sie haben zu gehen, um Berechtigungen Bearbeitenklicken Sie auf mehr Hinzufügen, Berechtigungen und dann fügen Sie die richtigen Liste auf dem Eimer für alle. Mit dieser Konfiguration AWS S3 wird nun in der Lage sein, um zurückzukehren, 404-Fehler und dann die Umleitungsregel wird richtig fangen, der Fall.
Genau wie dieser :
Und dann können Sie gehen, um Bearbeiten Umleitung Regeln und fügen Sie diese Regel :
Hier können Sie ersetzen die HostName subdomain.domain.fr mit Ihrer Domäne und dem KeyPrefix #!/wenn Sie nicht die hashbang-Methode für SEO-Zwecke.
Natürlich, all dies wird nur funktionieren, wenn Sie bereits setup-html5mode in Ihrem angular Anwendung.
InformationsquelleAutor der Antwort davidbonachera
Die einfachste Lösung, die Winkel 2+ - Anwendung diente von Amazon S3 und direkte URLs gearbeitet wird, um anzugeben, index.html sowohl als Index-und Fehler-Dokumente im S3-bucket-Konfiguration.
InformationsquelleAutor der Antwort Sergey Kandaurov
Sehe ich 4 Lösungen für dieses problem. Die ersten 3 waren bereits in Antworten und der Letzte ist mein Beitrag.
Legen Sie die error-Dokument index.html.
Problem: der response-body wird richtig sein, aber den status code 404, das tut weh SEO.
Legen Sie die Umleitung Regeln.
Problem: URL verschmutzt mit
#!
Seite und blinkt, wenn geladen.Konfigurieren CloudFront.
Problem: alle Seiten return 404 von Herkunft, so müssen Sie wählen, wenn Sie nicht cache nichts (TTL 0 wie vorgeschlagen) oder ob Sie zwischengespeichert werden, und haben Probleme bei der Aktualisierung der Website.
Prerender allen Seiten.
Problem: zusätzliche Arbeit zu prerender-Seiten, speziell wenn die Seiten sich Häufig ändern. Zum Beispiel eine news-website.
Mein Vorschlag ist, verwenden Sie die option 4. Wenn Sie prerender allen Seiten, es wird keine 404-Fehler für die erwarteten Seiten. Die Seite lädt gut und der Rahmen werden die Kontrolle und normal Verhalten, wie ein SPA. Sie können auch festlegen, dass die Fehler-Dokument anzeigen, um eine generische error.html Seite und eine Weiterleitungs-Regel zur Umleitung von 404-Fehlern auf eine 404.html Seite (ohne hashbang).
Bezüglich 403 Forbidden Fehler, ich lass Sie nicht überhaupt passieren. In meiner Anwendung, ich denke, dass alle - Dateien in die host-Eimer, öffentlich sind und ich diese mit der jeder option mit der Lesen Berechtigung. Wenn Ihre Website Seiten, die privat sind, sodass der Benutzer zu sehen, die HTML - layout sollte nicht das Thema sein. Was Sie brauchen, um zu schützen, ist die Daten und dies geschieht im backend.
Auch, wenn Sie haben, private Vermögenswerte, wie user-Fotos können Sie speichern Sie Sie in anderen Eimer. Weil die privaten Vermögenswerte müssen der gleichen Sorgfalt wie Daten und kann nicht verglichen werden, um die asset-Dateien, die verwendet werden, um host-app.
InformationsquelleAutor der Antwort Zanon
da das problem ist immer noch da-ich dachte, ich werfe in eine andere Lösung.
Meinem Fall war, dass ich wollte, um auto deploy alle pull requests an s3 für die Prüfung vor der Zusammenführung machen Sie zugänglich auf [meinedomain]/pull-requests/[pr-Nummer]/
(ex. http://www.example.com/pull-requests/822/)
Zu den besten meines Wissens nicht von s3-Regeln-Szenarien erlauben würde, mehrere Projekte in einem Eimer mit html5 routing so, während über die meisten stimmten Vorschlag funktioniert für ein Projekt im root-Ordner, ist es nicht für mehrere Projekte in eigene Unterordner.
Also ich wies meine domain auf meinem server, wo folgende nginx config hat den job
wird versucht die Datei, und wenn nicht gefunden wird davon ausgegangen, dass es html5-route und versucht, die. Wenn Sie eine 404-Winkel-Seite für nicht Gefundene Routen, die Sie nie an @not_found und erhalten Sie eckige 404-Seite zurückgegeben, anstelle des nicht gefundenen Dateien, die behoben werden konnte mit einigen wenn-Regel @get_routes oder so etwas.
Ich muss sagen, ich fühle mich nicht allzu wohl im Bereich der nginx config und mit regex für diese Angelegenheit, ich habe diese Arbeit mit einigen trial-and-error, also das funktioniert zwar ich bin sicher, es gibt Raum für Verbesserungen, und bitte teilen Sie Ihre Gedanken.
Hinweis: entfernen s3-Umleitung Regeln, wenn Sie hatte Sie in S3 config.
und btw funktioniert im Safari
InformationsquelleAutor der Antwort Andrew Arnautov
War auf der Suche für die gleiche Art von problem.
Ich landete mit einer Mischung aus den vorgeschlagenen Lösungen oben beschrieben.
Zuerst habe ich eine s3-bucket mit mehrere Ordner, jeder Ordner stellt einen reagieren/redux website.
Ich benutze auch cloudfront für die cache-Invalidierung.
So hatte ich die Verwendung von Routing-Regeln für die Unterstützung 404 und redirect Sie zu einem hash-config:
In mein js-code, brauchte ich Griff ihn mit einer
baseName
config für reagieren-router.Zunächst stellen Sie sicher, dass Ihre Abhängigkeiten sind interoperabel, die ich installiert hatte
history==4.0.0
wich war unvereinbar mitreact-router==3.0.1
.Meine Abhängigkeiten sind:
Habe ich einen
history.js
- Datei zum laden-Geschichte:Dieses Stück code können Sie behandeln das 404 gesendet durch den Server mit einem hash, und ersetzen Sie Sie in der Geschichte für das laden von Routen.
Sie können nun diese Datei für die Konfiguration Ihres Shop und Ihrer Root-Datei.
Hoffe, es hilft.
Sie werden bemerken, mit dieser Konfiguration, die ich redux-Injektor und ein homebrew-sagas Injektor für das laden von javascript-asynchrounously via-routing.
Nicht dagegen, mit diesen Linien.
InformationsquelleAutor der Antwort Guillaume Cisco
War ich auf der Suche nach einer Antwort auf diese selbst. S3 scheint nur Umleitungen unterstützt, können Sie nicht einfach umschreiben der URL und schweigend zurück eine andere Ressource. Ich überlege mir mit meinem build-script zu machen einfach Kopien von meinen index.html alle erforderlichen Pfad-locations. Vielleicht wird auch für Sie arbeiten.
InformationsquelleAutor der Antwort Ed Thomas
Dies ist die eleganteste Lösungdie ich finden - mit der app-router-Modul mit einer wildcard umleiten.
{ path: '**', redirectTo: '' }
Dann, wie erwähnt, in unzähligen posts oben, stellen Sie sicher, dass die Umleitung 404/403 Fehler index.html mit 200-status. Das problem ist, dass diese Ergebnisse in einem browser-refresh-laden der base-href-als (href + bisherige route). Wenn Sie wurden anzeigen von der router-Ansicht zur
www.my-app.com/home
dann der refresh wird sich zeigenwww.my-app.com/home/home
Streifen die doppelte Strecke, um den Pfad APP_BASE_HREF Modul weisen Sie die browser-base-href - genau wie dieser
Wenn Sie brauchen, um zu bewahren, die erste url-parameter, fügen Sie mehrere Ergebnisse
'/'
split.Browser trifft Ihren SPA-redirect für
www.your-app.com/home/home
wird nun ersetzen Sie die URL mitwww.your-app.com/home
und die app verhält sich wie erwartet von Ihrem in-app-routing-configInformationsquelleAutor der Antwort Chris Concannon