Amazon CloudFront respektiert die index.html-Regeln meines S3-Website-Buckets nicht

75

Ich hoste eine statische Website auf Amazon S3 mithilfe der Hosting-Option für statische Websites, sodass S3 einen Ordner rendert, ohne dass ich explizit auf meine Datei index.html verweise.

Hier ist zum Beispiel ein direkter Link zu einer Seite in meinem S3-Bucket: http://new.rdegges.com.s3-website-us-east-1.amazonaws.com/category/2009/ Wie Sie sehen können, wann Wenn Sie diese URL besuchen, rendert Amazon S3 automatisch die Datei index.html in diesem Verzeichnis, sodass ich saubere URLs haben kann.

Dies alles funktioniert gut auf S3. Das Problem, das ich habe, ist, dass Amazon Cloudfront auch dieses Verhalten richtig handhabt. Wenn ich eine Cloudfront-Distribution mit meinem als Ursprung angegebenen S3-Bucket erstelle und ihn anweise, 'index.html' als Root zu verwenden, funktioniert das Verhalten von index.html in S3 nicht mehr.

Hier ist zum Beispiel meine gleiche URL wie oben in Cloudfront: http://d1mj00c6pby3gc.cloudfront.net/category/2009/

Leider funktioniert die obige URL NICHT, aber wenn ich die Indexdatei manuell spezifiziere, funktioniert dies beispielsweise: http://d1mj00c6pby3gc.cloudfront.net/category/2009/index.html

Meine Frage lautet: Wie muss ich Cloudfront so konfigurieren, dass meine S3-Bucket-Einstellungen für meine Website berücksichtigt werden?

rdegges
quelle
Sie können es definitiv für die Wurzel einstellen. Ich bin mir jedoch nicht sicher, ob es pro Verzeichnis funktioniert. aws.typepad.com/aws/2010/08/…
dirn
2
Hey @dirn, yep! Ich verwende das Standardstammverzeichnis von index.html, aber aus irgendeinem Grund gilt es nicht für Unterordner (nur für die oberste Ebene). Ich finde das seltsam, da S3 die gleiche Einstellung hat und es auch für alle Unterordner gilt, arg.
rdegges
"Respektiert nicht" .. Woow! +1 von mir 😃
Abdennour TOUMI

Antworten:

121

Die Funktionen der S3-Website können in Verbindung mit Amazon CloudFront verwendet werden. Die S3-Website verwendet jedoch einen anderen Domainnamen als normale S3-Buckets. In diesem Fall müssen Sie Origin Domain Namedie Ursprungskonfiguration Ihrer CloudFront-Distribution auf festlegen new.rdegges.com.s3-website-us-east-1.amazonaws.com.

Sie können diese URL (Endpunkt) aus dem Bereich "Statisches Website-Hosting" in S3 entnehmen:

Statisches Website-Hosting-Panel auf S3

Sobald CloudFront auf den Domainnamen der S3-Website verweist, sollten die Funktionen der S3-Website funktionieren.

Wade Matveyenko
quelle
4
Tolle Auflösung, danke. Ich wette, dass dies vielen Leuten passiert, da die Cloudfront automatisch zum Bucket-Namen und nicht zur statischen Website-URL vervollständigt wird. Der Unterschied war mir zunächst nicht klar.
Einfach
6
Der einzige Nachteil ist, dass Sie SSL zwischen CloudFront und S3 nicht verwenden können, wenn Sie einen statischen Website-Endpunkt verwenden. Also, SSL- oder index.html-Behandlung: Wählen Sie eine aus.
Alex B
1
@AlexB Es gibt (jetzt) ​​eine Option beim Hinzufügen des Ursprungs, um entweder "Nur HTTP" oder "Match Viewer" zu verwenden. "Wenn Sie Match Viewer als Origin-Protokollrichtlinie auswählen und der Viewer über HTTPS eine Verbindung zu CloudFront herstellt, stellt CloudFront über HTTPS eine Verbindung zu Ihrem Ursprung her."
Zerkey
3
+2 - Ich bin gerade zurückgekommen, um Ihnen eine positive Bewertung zu geben, da dies mein Problem gelöst hat - und ich hatte Ihnen bereits eine positive Bewertung gegeben -, als mir dies das letzte Mal passiert ist. Das Knifflige ist, dass AWS den CloudFront-Ursprung automatisch in Ihren S3-Bucket vervollständigt. Die Standardeinstellung ist jedoch nicht die Website-URL, sondern die S3-URL. Sie würden denken, AWS würde wissen, dass der S3-Bucket als Website konfiguriert wurde, und die Standardeinstellung entsprechend anpassen.
Sheikhjabootie
2
@AlexB Ist das immer noch der Fall - dass Sie Cloudfront SSL nicht verwenden können, wenn Ihr Ursprungsdomänenname Ihr statischer S3-Website-Endpunkt ist?
Colemerrick
24

Ich möchte der akzeptierten Antwort einige Dinge hinzufügen.

Stellen Sie zunächst sicher, dass Sie eine Default Root ObjectCloud-Front haben. Wie in der Dokumentation angegeben, gilt dies nicht für subdirectories.

Wenn Sie eine neue Cloudfront-Distribution einrichten, können Sie Ihren Bucket auswählen bucket-name.s3.amazonaws.com. Beachten Sie, dass die Region nicht in der URL angegeben ist. Was Sie tun müssen, ist, die statische Site-URL von s3 abzurufen und diese als origin url(die Region wird dort sein) zu verwenden.

Michael Yagudaev
quelle
Ich hatte das Problem, dass das Root-Objekt nicht die Standard-index.html angab. Zuerst habe ich versucht, es an die Namen www.example.com und www.example.com/index.html zu senden, was nicht funktioniert hat, und ich habe es funktionieren lassen, als ich einfach das Stammobjekt als index.html festgelegt habe
Jacob Bryan
Ich musste das CF-Standardstammobjekt auf leer setzen (nicht gesetzt) ​​und dann das Indexdokument auf dem s3-Bucket auf index.html setzen
Joshua Coady
2

Dies könnte spät im Spiel sein, aber schauen Sie sich Lambda @ Edge an . Sie können Origin Requests ohne Erweiterung abfangen und auf das Dokument index.html im Ordner verweisen. Diese Ergebnisse werden zwischengespeichert, sodass der Lambda nur ausgeführt wird, wenn er eine neue Anforderung erhält.

Trocknet Van Hansewijck
quelle