Wie legen Sie eine Standard-root-Objekt für die Unterverzeichnisse, die für ein statisch gehosteten website auf Cloudfront?
Wie legen Sie eine Standard-root-Objekt für Unterverzeichnisse auf eine statisch gehosteten website auf Cloudfront? Speziell möchte ich www.example.com/subdir/index.html
bedient werden, wenn der Benutzer fragt nach www.example.com/subdir
. Beachten Sie, dies ist für die Auslieferung einer statischen website statt in einem S3-bucket. Darüber hinaus möchte ich eine origin-access id Zugriff auf den S3-bucket, um nur Cloudfront.
Nun, ich bin mir bewusst, dass Cloudfront funktioniert anders als S3 und amazon Mitgliedstaaten speziell:
Das Verhalten von CloudFront Standard-root-Objekte unterscheidet sich von der
Verhalten von Amazon S3-Dokumente indizieren. Beim konfigurieren einer Amazon S3
Eimer, als eine website, und geben Sie die index-Dokument, Amazon S3 gibt
der index Dokument selbst wenn ein Benutzer ein Unterverzeichnis, das in der
Eimer. (Eine Kopie des index-Dokument angezeigt werden muss in jedem
Unterverzeichnis.) Weitere Informationen zum konfigurieren der Amazon S3
Eimer, als Webseiten und über index-Dokumente, finden Sie unter Hosting
Websites, die auf Amazon S3-Kapitel in der Amazon Simple Storage Service
Developer Guide.
Als solche, obwohl Cloudfront ermöglicht uns, geben Sie einen Standard-root-Objekt, das funktioniert nur für www.example.com
und nicht für www.example.com/subdir
. Um dies zu umgehen, Schwierigkeiten, wir können ändern den origin-domain-Namen, um auf die website Endpunkt gegeben durch S3. Dies funktioniert hervorragend und die Möglichkeit, die root-Objekte werden einheitlich angegeben. Leider werden diese nicht angezeigt werden-kompatibel mit origin access identities. Speziell die links oben, Staaten:
Ändern Bearbeiten-Modus:
Web-Distributionen, die Sie Auf die Ursprünge Registerkarte, klicken Sie auf die Herkunft, die Sie Bearbeiten möchten, und klicken Sie auf Bearbeiten. Sie können nur einen origin-Zugang
Identität für die Herkunft, für die Herkunft Typ S3 Herkunft.
Grundsätzlich, um die korrekte Standard-root-Objekt, verwenden wir die S3-website-Endpunkt und nicht die website der Eimer selbst. Dies ist nicht kompatibel mit origin-access-Identität. Als solche, meine Fragen läuft darauf hinaus, entweder
-
Ist es möglich, geben Sie einen Standard-root-Objekt für alle Unterverzeichnisse, die für ein statisch gehosteten website auf Cloudfront?
-
Ist es möglich, um das setup eine origin Zugang Identität für Inhalte, die Ihnen von Cloudfront, wo der Ursprung ist einer S3-website-Endpunkt und nicht von einem S3-bucket?
- Ich denke, das ist jetzt machbar mit Lambda@Rand, eine Funktion, die leitet alle URLs mit / am Ende von /index.html ich werde versuchen es auf meine website und melden die Ergebnisse zurück und poste die detaillierte Konfiguration als eine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE: Es sieht aus wie ich war falsch! Sehen JBaczuk die Antwort, die die akzeptierte Antwort auf diesen thread.
Leider, die Antwort auf Ihre beiden Fragen lautet Nein.
1. Ist es möglich, geben Sie einen Standard-root-Objekt für alle Unterverzeichnisse, die für ein statisch gehosteten website auf Cloudfront?
Nicht. Wie bereits in der AWS-CloudFront-docs...
2. Ist es möglich, um das setup eine origin Zugang Identität für Inhalte, die Ihnen von Cloudfront, wo der Ursprung ist einer S3-website-Endpunkt und nicht von einem S3-bucket?
Nicht direkt. Ihre Optionen für die Herkunft mit CloudFront sind S3-buckets oder Ihrem eigenen server.
Ist es, dass die zweite option eröffnen sich einige interessante Möglichkeiten, wenn. Dies ist wahrscheinlich die Niederlagen der Zweck von was Sie versuchen zu tun, aber Sie konnte die Einrichtung eigener server, dessen einzige Aufgabe es ist eine CloudFront-origin-server.
Wenn eine Anforderung für http://d111111abcdef8.cloudfront.net/install/, CloudFront leitet diese Anfrage an den origin-server zu Fragen, für
/install
. Sie können Ihren Ursprungs-server, wie Sie wollen, einschließlich dienenindex.html
in diesem Fall.Oder man könnte schreiben, eine kleine web-app, die nur dauert dieser Aufruf und bekommt es direkt aus dem S3 sowieso.
Aber ich merke, dass die Einrichtung Ihre eigenen server haben und sich Gedanken über die Skalierung kann die Niederlage der Zweck von dem, was Sie versuchen zu tun in den ersten Platz.
Dort IST ein Weg, dies zu tun. Stattdessen verweisen Sie auf Ihre Eimer, indem Sie ihn in der dropdown - (www.example.com.s3.amazonaws.com), zeigen Sie es, um die statische domain Ihrer Eimer (zB. http://www.example.com.s3-website-us-west-2.amazonaws.com):
Dank Das AWS-Forum-thread
/
und der Benutzer vergisst, den letzten/
wie/blog
vs/blog/
dann S3 Umleitung zu[origin path]/blog/
HTTPS
nur?www.example.com.s3-website-us-west-2.amazonaws.com
solltewww.example.com.s3-website.us-west-2.amazonaws.com
beachten Sie den Bindestrich zu Punkt ändern, nachdem dies3-website
.website_endpoint
(C. F. terraform.io/docs/providers/aws/d/s3_bucket.html). WARNUNG: Sie müssen zum aktualisieren derorigin
Einstellungen in Ihrer CloudFront-Verteilung (C. F. terraform.io/docs/Anbieter/aws/r/...): ja, per default, wenn nichts angegeben wird, wird eine S3 Herkunft, aber Sie brauchen jetzt eine Benutzerdefinierte Herkunft.Aktivierung S3-hosting bedeutet Sie haben zum öffnen des Eimers der Welt. In meinem Fall habe ich benötigt, um die Eimer, die private und die Nutzung der origin-access-identity-Funktionalität, um den Zugriff auf Cloudfront nur. Wie @Juissi vorgeschlagen, eine Lambda-Funktion beheben können, die Umleitungen:
Nach der Veröffentlichung der Funktion, gehen Sie zu Ihrer cloudfront-Verteilung in der AWS-Konsole. Gehen Sie zu
Behaviors
, dann wählen SieOrigin Request
unterLambda Function Associations
, und schließlich fügen Sie den ARN zu Ihrer neuen Funktion.Gibt es einen anderen Weg, um eine Standard-Datei, serviert in einem Unterverzeichnis, wie
example.com/subdir/
. Man kann tatsächlich (über ein Programm) speichern der Datei mit dem Schlüsselsubdir/
im Eimer. Diese Datei wird nicht zeigen sich in der S3 management Konsole, aber es wirklich existiert, und CloudFront wird es dienen.Workaround für das Problem ist die Verwendung von lambda@edge für das umschreiben der Anfragen. Man braucht nur das setup der lambda-Ausdruck für die CloudFront-Verteilung viewer-Anfrage event-und umschreiben, dass alles endet mit '/' UND nicht gleich '/' mit Standard-Dokument-root z.B. index.html.
Ich weiß, das ist eine alte Frage, aber ich kämpfte sich durch es selbst. Letztlich war mein Ziel weniger um eine Standard-Datei in ein Verzeichnis, und mehr, um das Ergebnis am Ende einer Datei, die serviert wurde, ohne
.html
am EndeLandete ich entfernen
.html
aus dem Dateinamen und ein Programm/manuell festlegen des mime-Typstext/html
. Es ist nicht die traditionelle Weise, aber es scheint zu funktionieren, und erfüllt meine Anforderungen für die pretty urls, ohne dabei die Vorteile der cloudformation. Einstellung der mime-Typ ist ärgerlich, aber ein kleiner Preis zu zahlen für die Vorteile, die meiner Meinung nachEs ist ein "offizielle" Anleitung veröffentlicht, die auf AWS blog, die empfiehlt die Einrichtung eines Lambda@Edge-Funktion, ausgelöst durch Ihre CloudFront-Verteilung:
Folgen des oben verlinkten Handbuchs, um zu sehen, alle Schritte, die erforderlich sind, um diese Einrichtung, einschließlich S3-bucket, CloudFront-Verteilung und Lambda@Edge die Erstellung einer Funktion.
Andere alternative zur Verwendung von lambda@edge ist die Verwendung CloudFront-Fehler-Seiten. Einrichten eines Benutzerdefinierte Fehlerantwort zu senden 403 ist auf eine bestimmte Datei. Dann fügen Sie javascript zu, dass-Datei Anhängen index.html urls, die Ende in einer /. Beispiel-code: