Wir sind gerade auf Amazon AWS umgestiegen. Wir haben derzeit eine EC2-Instanz, die gut funktioniert. Es läuft Nginx vorne und Apache im Backend. Das läuft auch gut. Alle Sites werden ordnungsgemäß gestartet und enthalten den Cache-Control-Header für Dateien, die vom EC2 bereitgestellt werden.
Das Problem liegt bei ALLEN statischen Dateien, die wir in Amazon S3 abgelegt haben und auf die über CloudFront CDN zugegriffen wird . Wir können problemlos auf die Dateien zugreifen (und dies ist mit CORS kein Problem), aber anscheinend liefert CloudFront keine Dateien mit Cache-Control-Header. Wir möchten das Browser-Caching nutzen.
So wie ich das sehe, spielt die EC2-Instanz hier keine Rolle, da die statischen Dateien direkt von S3 + CloudFront bereitgestellt werden. Die Anforderung wird nicht an den Webserver in EC2 gesendet.
Ich bin völlig verloren.
Frage: 1) Wie stelle ich in diesem Fall die Cache-Kontrolle ein? 2) Kann die Cache-Kontrolle eingestellt werden? Von S3 oder CloudFront?
Hinweis: Ich habe einige Seiten in Google aufgerufen, auf denen Sie die Kopfzeile in S3 für einzelne Objekte festlegen können. Dies ist wirklich keine produktive Methode, da es sich in meinem Fall um mehrere Objekte handelt.
Vielen Dank!
Antworten:
Nun, "produktiv" oder nicht, so ist es eigentlich konzipiert, um zu funktionieren.
Cloudfront nicht hinzufügen
Cache-Control:
Header.Cloudfront gelangt Durch (und auch Hinsicht, wenn nicht anders konfiguriert) die
Cache-Control:
durch den Ursprungsserver bereitgestellt Headern, die in diesem Fall ist , S3.Damit
Cache-Control:
von S3 beim Abrufen eines Objekts Header bereitgestellt werden, müssen diese beim Hochladen des Objekts in S3 bereitgestellt oder durch eine nachfolgende Operation put + copy zu den Metadaten des Objekts hinzugefügt werden, mit der ein Objekt intern in sich selbst kopiert werden kann S3, Ändern der Metadaten im Prozess. Dies macht die Konsole im Hintergrund, wenn Sie Objektmetadaten bearbeiten.Es gibt auch (falls Sie sich fragen) keine globale Einstellung in S3, mit der alle Objekte in einem Bucket gezwungen werden, diese Header zurückzugeben - es handelt sich um ein Objektattribut.
Update: Lambda @ Edge ist eine neue Funktion in CloudFront , mit der Sie Trigger für Anforderungen und / oder Antworten zwischen Viewer und Cache und / oder Cache und Ursprung auslösen können, indem Sie in Node.js geschriebenen Code für eine einfache Anforderungs- / Antwortobjektstruktur ausführen von CloudFront ausgesetzt.
Eine der Hauptanwendungen für diese Funktion ist das Manipulieren von Headern. Während die obigen
Cache-Control
Angaben noch korrekt sind - CloudFront selbst fügt sie nicht hinzu - ist es jetzt für eine Lambda-Funktion möglich, sie zu der von CloudFront zurückgegebenen Antwort hinzuzufügen.Dieses Beispiel wird
Cache-Control: public, max-age=86400
nur hinzugefügt , wennCache-Control
in der Antwort noch kein Header vorhanden ist.Wenn Sie diesen Code in einem Origin Response-Trigger verwenden, wird er jedes Mal ausgelöst, wenn CloudFront ein Objekt aus dem Ursprung abruft und die Antwort ändert, bevor CloudFront sie zwischenspeichert.
Update (20.06.2018): Vor kurzem habe ich eine Feature-Anfrage an das CloudFront-Team gesendet, um die Konfiguration von Antwort- Headern statischen Ursprungs als Ursprungsattribute zu ermöglichen, ähnlich wie statische Anforderungs- Header jetzt hinzugefügt werden können ... aber mit einem twist, so dass jeder zu konfigurierende Header bedingt hinzugefügt werden kann (nur wenn der Ursprung diesen Header nicht in der Antwort angegeben hat) oder unbedingt (Hinzufügen des Headers und Überschreiben des Headers ab dem Ursprung, falls vorhanden).
Bei Funktionsanfragen erhalten Sie normalerweise keine Bestätigung darüber, ob sie tatsächlich die Implementierung der neuen Funktion in Betracht ziehen oder ob sie möglicherweise bereits daran gearbeitet haben. Es wird nur angekündigt, wenn sie fertig sind. Ich habe also keine Ahnung, ob diese implementiert werden. Es muss argumentiert werden, dass diese Funktion in der Basisfunktionalität nicht erforderlich ist, da sie bereits über Lambda @ Edge verfügbar ist. Mein Gegenargument lautet jedoch, dass die Basisfunktionalität ohne diese Funktion nicht vollständig ist Führen Sie eine einfache Manipulation des Headers für statische Antworten durch. Wenn dies der einzige Grund ist, warum ein Trigger erforderlich ist, sind Lambda-Trigger aus finanzieller und latenter Sicht unnötig teuer (auch wenn beides nicht zwangsläufig ein ungewöhnlicher Aufwand ist).
quelle