Warum folgt CloudFront nicht auf den Umleitungspfad der S3-Website?

18

Ich habe eine Website, die auf Amazon S3 gehostet wird. Es ist die neue Version einer alten Website, die auf WordPress gehostet wird.

Ich habe einige Dateien mit den Metadaten eingerichtet Website Redirect Location, um den alten Speicherort zu verarbeiten und sie auf die neuen Webseiten umzuleiten.

Zum Beispiel: Ich hatte das http://www.mysite.com/solution, zu dem ich umleiten möchte. http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlAlso habe ich eine leere Datei namens solutionin meinem Bucket mit den richtigen Metadaten erstellt:

Website Redirect Location= /product.html

Die S3-Redirect-Metadaten entsprechen einer 301 Moved Permanently, die sich hervorragend für SEO eignet. Dies funktioniert hervorragend, wenn Sie direkt über die S3-Domain auf die URL zugreifen.

Ich habe auch eine CloudFront-Distribution basierend auf dem Website-Bucket eingerichtet. Und wenn ich versuche, über meine Distribution darauf zuzugreifen, funktioniert die Umleitung nicht, dh:

http://xxxx123.cloudfront.net/solution leitet nicht weiter, sondern lädt stattdessen die leere Datei herunter.

Meine Frage ist also, wie die Umleitung über die CloudFront-Distribution beibehalten werden kann. Oder eine Idee, wie man mit der Weiterleitung umgeht, ohne die SEO zu beeinträchtigen?

Vielen Dank

Yannick Chaze
quelle

Antworten:

47

Ich bin kürzlich auf dieses Problem gestoßen und habe eine Problemumgehung gefunden, die zu funktionieren schien.

Ich habe eine Cloudfront-Distribution mit einem benutzerdefinierten Ursprung erstellt, der auf den statischen S3-Website-Hostnamen anstelle des Bucket-Hostnamens verweist. Im Falle des OP wäre der gewünschte Ursprung.

mysite.s3-website-us-east-1.amazonaws.com

Wenn Sie eine Cloudfront-Distribution nur mit dem Bucket als Ursprung treffen, funktioniert dies nicht, da der Bucket keine Weiterleitungen bereitstellt. Es werden nur Dateien bereitgestellt und Metadaten gespeichert.

Hoffentlich hilft das.

bmatsuo
quelle
Beachten Sie jedoch, dass Cloudfront die Umleitungsantwort zwischenspeichert, anstatt sie zu befolgen. Folglich werden Downloads von Ressourcen, die Sie umleiten, um Cloudfront zu umgehen.
Tfischbach
2
bmatsuo - Wenn wir Ihnen dafür eine Milliarde Wiederholungspunkte geben könnten, würden wir. Ich danke dir sehr. Du hast den Tag wirklich gerettet.
Snipe
Das hat sehr geholfen! Erwähnenswert für alle S3-Neulinge: Um einen statischen Bucket zu erstellen, wechseln Sie zu Ihrem Bucket und rufen Sie die Registerkarte Eigenschaften auf. Klicken Sie auf Static Website Hosting. Das gibt Ihnen die richtige URL, die für die Weiterleitung ermöglicht :)
Rick6
2

Analyse

Nach der dokumentierten Anfrage und Antwort Verhalten, und unterstützte HTTP - Statuscodes für Custom Origins , Amazon Cloudfront nicht folgen Redirects , leider:

[...] Nachdem Sie die Umleitung konfiguriert haben, sendet CloudFront Front die Anforderung zum ersten Mal an den Ursprung, wenn ein Endbenutzer eine Anforderung für das Objekt sendet, und der Ursprung antwortet mit einer Umleitung (z. B. 302 Vorübergehend verschoben). CloudFront speichert die Umleitung im Cache und gibt sie an den Endbenutzer zurück. CloudFront folgt nicht der Umleitung. [Hervorhebung von mir]

Natürlich verwenden Sie Amazon S3 anstelle eines benutzerdefinierten Ursprungs, und ein verwandter Abschnitt fehlt insbesondere im Anforderungs- und Antwortverhalten für Amazon S3 Origins , da Amazon S3-Weiterleitungen erst vor kurzem hinzugefügt wurden (siehe Amazon S3 - Support für Websites) Redirects ), es könnte dort einfach noch fehlen.

Dementsprechend gehe ich davon aus, dass Sie keine leere Datei mit dem HTTP-Statuscode 200 OK erhalten , sondern einen HTTP-Status 301 Permanent ohne Text verschoben - haben Sie dies tatsächlich mit einem Browser oder eventuell nur mit einem Befehlszeilentool wie überprüft zB cURL oder HTTPie ? Die letzteren Tools erfordern normalerweise einen expliziten Parameter, um Weiterleitungen zu folgen, sodass dies leicht unbemerkt bleibt.

Mögliche Lösung

Wenn die Analyse korrekt ist, müssen Sie die Umleitung so konfigurieren, dass sie CloudFront explizit als Ziel hat. Weitere Informationen finden Sie unter Umleitungen :

Sie können Ihren Webserver so konfigurieren, dass Anforderungen an einen der folgenden Speicherorte umgeleitet werden:

  • Die neue URL des Objekts auf dem Ursprungsserver. Wenn der Endbenutzer der Umleitung zur neuen URL folgt, umgeht der Endbenutzer CloudFront und geht direkt zum Ursprung. Aus diesem Grund wird empfohlen, Anforderungen nicht an die neue URL des Objekts im Ursprung umzuleiten.

  • Die neue CloudFront-URL für das Objekt. Wenn der Endbenutzer die Anforderung sendet, die die neue CloudFront-URL enthält, ruft CloudFront das Objekt von der neuen Position auf Ihrem Ursprung ab, speichert es an der Randposition im Cache und gibt das Objekt an den Endbenutzer zurück. Nachfolgende Anforderungen für das Objekt werden vom Edge-Standort bedient. Dies vermeidet die Latenz und Last, die mit dem Anfordern des Objekts vom Ursprung durch Betrachter verbunden sind. Bei jeder neuen Anforderung für das Objekt fallen jedoch Gebühren für zwei Anforderungen an CloudFront an.

Steffen Opel
quelle
Wenn ich die URL cURLe, die über die CloudFront-Distribution umgeleitet werden muss, erhalte ich Folgendes: HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 Ich verstehe, dass die Umleitung von S3 verwaltet wird. In diesem Fall wird die Datei von CloudFront gehostet, und es kümmert sich nicht um Umleitungsheader, die für S3 als S3 festgelegt wurden Ist der Webserver der Datei kann ich die Weiterleitung nur mit den Metadaten abbilden.
Yannick Chaze