Beim Bereitstellen einer statischen Site außerhalb von Amazon S3 frage ich mich, wie die .html
Dateierweiterungen für jede Seite entfernt werden können.
Gerade habe ich:
mysite.com/ # works fine, serves index.html
mysite.com/mypage.html # works fine
mysite.com/mypage # doesn't work
Der Fehler für /mypage
zeigt:
404 Not Found
Code: NoSuchKey
Message: The specified key does not exist.
Key: mypage
RequestId: 1089D7A26EFED9AD
HostId: Ud8cFy8Zl1mJ+oFjFOmU1Xacq9+v70KuaJfOc4nFMEPhd66AkLhr4Pj5u0QH6Gog
Ich habe versucht, das auf Content-Type
zu setzen text/html
, wie in diesem Beitrag beschrieben , aber es behebt das Problem nicht für mich.
Wie kann ich /mypage
die Datei /mypage.html
auf S3 bereitstellen?
Content-type
Header in den Befehlszeilentools? Oder in der Konsole von S3 oder Cloudfront?Content-type
Headers mithilfe der folgenden Elemente in der Konsole (Windows):aws s3 cp C:\folder\file s3://folder/file --content-type "text/html"
Referenz: docs.aws.amazon.com/cli/latest/reference/s3/cp.html<!doctype html>
von dem<html xmlns="http://www.w3.org/1999/xhtml" >
, den ich verwendet habe, geändert habe .Im Allgemeinen können Sie unter Amazon S3 saubere URLs erstellen:
Laden Sie die Auslagerungsdatei mit einem "sauberen" Namen hoch, z. B.
mypage
und setzen Sie denContent-Type
Satz auftext/html
(als den Beitrag, auf den Sie verlinkt haben). Sie müssen die Datei auf Ihrem System umbenennen, bevor Sie sie hochladen, um keine Erweiterung zu haben, oder sie nach dem Hochladen ohne die Erweiterung in S3 umbenennen . Der Dateiname in S3 darf keine Erweiterung haben.Erstellen Sie einen Ordner mit dem Namen "sauber" und laden Sie die Auslagerungsdatei in diesen Ordner hoch, wobei der Name auf das Standardindexdokument festgelegt ist , z
index.html
. Sie müssen den Standardnamen des Indexdokuments überprüfen. Dies wird festgelegt, wenn Sie Ihren Bucket als Website konfigurieren, kann aber später geändert werden.Wenn dies nicht funktioniert, können Sie ein neues Null-Byte-Objekt mit dem Namensschlüssel hochladen
mypage
und dann eine Seitenumleitung festlegen, indem Sie denWebsite Redirect Location
Schlüssel mit einem Wertmypage.html
in den Metadaten während des Upload-Vorgangs angeben. Siehe Konfigurieren einer Webseitenumleitung in der Amazon S3-Dokumentation.Sie können auch die Datei in ein neues Objekt mit dem Namen kopieren
mypage
mitContent-Type
Satztext/html
.quelle
mypage
nach durchmypage.html
, sodass die.html
Erweiterung nicht wirklich entfernt wird . Ich habe auch beide Ansätze in 1 & 2 ausprobiert und keiner funktioniert für mich. Irgendwelche Ideen, warum das so sein könnte?Löschen Sie, wie einige bereits gesagt haben, die Dateierweiterung, aber befolgen Sie dann einfach die folgenden Schritte:
Und wie bereits erwähnt, stellen Sie sicher, dass Ihre neuen Links in Ihrem HTML-Code nicht mehr die Dateierweiterung .html enthalten. Das hat bei mir funktioniert.
quelle
Das Erstellen eines Ordners bei
/mypage
und dasindex.html
Einfügen in diesen Ordner hat bei mir nicht funktioniert. Es stellt sich heraus, dass dies daran lag, dass die Einstellung "Indexdokument" des Buckets geändert wurde inmyindex.html
:Dies wurde tatsächlich auch auf alle Unterordner angewendet, sodass es
/mypage/index.html
auf der/mypage
Route nicht gesucht wurde . es suchte/mypage/myindex.html
stattdessen.Ich habe die
myindex.html
Einstellung einfach wieder geändertindex.html
und die Standardordnerstruktur funktioniert. Es hätte genauso gut funktioniert,myindex.html
Dateien überall mit dieser Einstellung zu verwenden, aber das schien verwirrend, ohne wirklich zu gewinnen.Ich weiß immer noch nicht, warum das Setzen von
Content-Type
auftext/html
nicht funktioniert - es scheint so, als ob es sollte, da dies an mehreren Stellen erwähnt wird.Wie auch immer, das Problem wird gelöst, indem die Buckets
Index Document
und alle zu verwendenden Unterordner geändert werdenindex.html
.quelle
Mit der AWS CLI:
Angenommen, Sie haben die Erweiterung aus dem Dateinamen entfernt und AWS CLI mit Ihrem Konto eingerichtet, können Sie die Metadaten der Datei festlegen, indem Sie diesen Befehl in Ihrer Konsole ausführen:
aws s3 cp /path/to/file s3://yourwebsite.com --content-type 'text/html' --acl public-read
quelle
Sehr einfache und getestete Lösung. ::
quelle
Wenn Sie eine JSON-Datei hochladen möchten. Speichern Sie die JSON-Datei ohne Erweiterung auf Ihrem lokalen Computer.
Verwenden Sie in der AWS CLI den folgenden Befehl:
aws s3 mb s3://<s3bucketname> #output make_bucket: s3bucketname aws s3 cp path\to\local\file s3://<s3bucketname> --content-type 'application/json' --acl public-read #output upload: .\<filename> to s3://<s3bucketname>/<filename>
Jetzt können Sie über die URL auf die Datei zugreifen:
https://<s3bucketname>.s3.amazonaws.com/<filename>
quelle
Ich habe ein automatisiertes Skriptbeispiel hinzugefügt, um die Erweiterung * .HTML zu entfernen, und durch Hinzufügen eines Metaobjekts vom Inhaltstyp auf s3 hochgeladen. Ich benutze Javascript, um eine sh-Datei zu erstellen. Ich führe eine sh-Datei aus.
const recursive = require("recursive-readdir"); const fs = require("fs"); (async (params) => { let buffer = "aws s3 cp ./out s3://www.Example.com \n"; await recursive("out", [ "css", "_next", "images", "static", "svg", "*.ico", "*.txt", "*.xml", "index.html", "404.html", ]).then( (files) => { for (const file of files) { const path = file.substring(file.indexOf("\\") + 1); buffer += `aws s3 cp --content-type 'text/html' --metadata-directive REPLACE ./out/${path} s3://www.example.com/${path} \n`; const removeExtension = file.replace(/\.[^/.]+$/, ""); fs.rename(file, removeExtension, function (err) { if (err) console.log("ERROR: " + err); }); } }, (error) => { console.error("something exploded", error); } ); fs.writeFileSync("deploy.sh", "echo 'copy your files' \n"); fs.appendFileSync("deploy.sh", buffer); fs.appendFileSync("deploy.sh", 'echo "Invalidation cloudfront"'); fs.appendFileSync("deploy.sh", 'aws cloudfront create-invalidation --distribution-id XXXXXXX --paths "/*" '); })();
quelle
Eine andere mögliche Lösung ist die Verwendung von Lambda @ edge power, Dokumentationsreferenz hier .
quelle
Der Grund, warum es ohne den abschließenden Schrägstrich in der Stammdomäne funktioniert, ist, dass Sie diese Struktur für Ihren Hauptindex haben:
Dann geht der Server und Server die Index-Standardseite, die Folgendes zeigt:
Wenn Sie nicht möchten, dass der Schrägstrich für alle Ihre Seiten angezeigt wird, sollten Sie dies auch für alle Ihre HTML-Dateien tun. Anstatt von
Tun
Anschließend zeigt der Server die Standardindexdatei für den Ordner "mypage" an, die in der URL angezeigt wird
quelle