it-swarm.com.de

Umleitung zu index.html für S3-Unterordner

Ich habe eine Domain example.com. Ich habe einen S3-Bucket namens example.com setup mit einer index.html-Datei, die funktioniert. Nun möchte ich zwei Unterordner mit dem Namen old und new erstellen, die jeweils eine separate Version einer einzelnen Seitenanwendung enthalten. Das Anfordern von https://example.com/old (Ich möchte den index.html bei der Eingabe der Anforderung in die Adressleiste des Browsers weglassen) öffnet die index.html-Datei im Unterordner old und das Anfordern von https://example.com/new öffnet den index.html. Was ist der beste Weg, um diese Weiterleitungen zu machen? Soll ich etwas in Route 53 einrichten example.com/old -> example.com/old/index.html oder gibt es eine bessere Möglichkeit, dies zu tun?

8
g3blv

Sie brauchen keine Lambda-Funktion, die Ihrem Projekt Kosten und Komplexität verleiht.

Die folgende Antwort wird aus https://stevepapa.com/ zitiert.

Es wird erwartet, dass https://stevepapa.com/my-great-new-post/ genauso funktioniert wie: https://stevepapa.com/my-great-new-post/index.html

Es gibt eine clevere Methode, um diese Informationen an die Cloudfront-Distribution weiterzuleiten. Dazu muss der Ursprungsursprung von der Quelle, die Cloudfront Ihnen standardmäßig bietet, geändert werden.

Wenn Sie die Ursprungsquelle auswählen, zeigt Cloudfront eine Liste der S3-Buckets an.  editing Origin

Anstatt die Quelle aus dem in der Dropdown-Liste angezeigten Bucket festzulegen, müssen Sie den statischen Webhosting-Endpunkt für diese Ressource von der Seite mit den S3-Einstellungen abrufen und manuell einfügen.  where the static hosting endpoint url is

Verwenden der statischen Quelle für die Cloudfront-Verteilung Ursprung bedeutet, dass jede Anforderung an diese Verteilung die Suche nach Stammobjekten des S3 verwendet, und Ihre 404-Antworten sollten verschwinden, wenn die Referenzen durchlaufen.

Wichtig: Löschen Sie anschließend Ihren Browser-Cache und die Elemente in Ihrer Cloudfront-Distribution ungültig machen . Andernfalls werden die von Ihnen vorgenommenen Änderungen nicht sofort aktiviert.

10
Marc Guiselin

Ich hatte dieses Problem also auch letzte Nacht.

Das Problem ist wie folgt: S3 ist, wenn es als Website-Bucket konfiguriert ist, verzeihend und hat die Indexdokumenteinstellung auf index.html gesetzt, und dies wird im Stammverzeichnis angewendet, dh example.com wird tatsächlich zu example.com/index.html umgeleitet, und auch dies Wird auf Unterordnerebene angewendet. Daher sollten example.com/new oder example.com/new/ zu example.com/new/index.html umgeleitet werden, wo sich im Bucket ein Objekt befinden würde. (Wenn nicht, erhalten Sie stattdessen eine NoSuchKey-Fehlermeldung.)

Sie "upgraden" sich jedoch auf CloudFront, wahrscheinlich für HTTPS, und diese Funktion wird nicht mehr benötigt. CloudFront ruft stattdessen explizite API-Aufrufe an S3 auf und löst daher keine Indexdokumentkonzession aus. Es funktioniert für das Stammverzeichnis, aber nicht für Unterordner.

Die RoutingRules-Lösung sieht für mich nicht sauber aus, denn durch die Angabe von KeyPrefixEquals und nicht durch genau gleichem Schlüssel (der nicht existiert) glaube ich, dass Sie unbeabsichtigte Übereinstimmungen erhalten würden.

Ich habe stattdessen eine Lambda @ Edge-Regel implementiert, die die Anforderung, die CloudFront an S3 stellt, umschreibt, um einen richtigen Schlüsselwert zu erhalten.

Beginnen Sie mit den Lambda-Dokumenten und dem A/B-Testbeispiel hier: https://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-general -Beispiele

Ändern Sie den Code in:

'use strict';

exports.handler = (event, context, callback) => {
    /*
     * Expand S3 request to have index.html if it ends in /
     */
    const request = event.Records[0].cf.request;
    if ((request.uri !== "/") /* Not the root object, which redirects properly */
        && (request.uri.endsWith("/") /* Folder with slash */
            || (request.uri.lastIndexOf(".") < request.uri.lastIndexOf("/")) /* Most likely a folder, it has no extension (heuristic) */
            )) {
        if (request.uri.endsWith("/"))
            request.uri = request.uri.concat("index.html");
        else
            request.uri = request.uri.concat("/index.html");
    }
    callback(null, request);
};

Und veröffentlichen Sie es in Ihrer CloudFront-Distribution.

3
jkingok

Mit einer HTML-Weiterleitungsdatei ist dies noch einfacher möglich

  1. Erstellen Sie eine einfache Datei mit dem Namen my-great-new-post.

  2. Schreiben Sie einen Meta-Redirect-Code in diese Datei (ich habe den folgenden Code eingefügt)

  3. hochladen einer Datei in den Root-Bucket (in dem sich der Ordner my-great-new-post befindet)

  4. ändern Sie die Metadaten der neuen Datei und erstellen Sie den Inhaltstyp: text/html

Hier liegt der Inhalt der Datei:

<!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="refresh" content="0; url=/my-great-new-post/index.html">
    </head>
    <body>
    </body>
    </html>
0
AliAx

Sie können versuchen, Umleitungsregeln festzulegen. Here ist eine ungeprüfte Regel. 

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>old</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>old/index.html</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>new</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>new/index.html</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>
  1. Konfigurieren Sie Ihren Bucket so, dass eine statische Website bereitgestellt wird
  2. Erstellen Sie eine CloudFront-Distribution : Setzen Sie Ihren Bucket als Origin und lassen Sie die OriginPath leer (Standard: /).
  3. Erstellen Sie Route53 RecordSet, das mit Ihrer CloudFront-Distribution verknüpft ist

Sie finden eine hilfreiche Lösung hier

Frage: Was soll passieren, wenn Ihr Kunde example.com (ohne old/new) eingibt?

Bearbeiten: 2. ist optional. Sie können Ihr Route53 RecordSet auch mit Ihrer statischen Website verknüpfen, aber mit CloudFront können Sie Ihr Wesbite mit https (mithilfe von AWS Certificate Manager ) bereitstellen.

0
MaiKaY