En servant un site statique à partir d'Amazon S3, je me demande comment se débarrasser des extensions de fichier .html
pour chaque page.
En ce moment j'ai:
mysite.com/ # works fine, serves index.html
mysite.com/mypage.html # works fine
mysite.com/mypage # doesn't work
L'erreur pour /mypage
indique:
404 Not Found
Code: NoSuchKey
Message: The specified key does not exist.
Key: mypage
RequestId: 1089D7A26EFED9AD
HostId: Ud8cFy8Zl1mJ+oFjFOmU1Xacq9+v70KuaJfOc4nFMEPhd66AkLhr4Pj5u0QH6Gog
J'ai essayé de régler le Content-Type
sur text/html
, comme indiqué dans ce message , mais cela ne résout pas le problème.
Comment faire pour que /mypage
serve le fichier à /mypage.html
sur S3?
Je viens d'avoir ce problème et j'aimerais partager la solution:
Vous devez définir les métadonnées du fichier Content-type
sur text/html
ET renommer le fichier en supprimant le .html
de la fin.
De cette façon, vous pourrez accéder à toutes les pages sans l’extension de fichier.
En général, sur Amazon S3, pour créer des URL propres, vous pouvez:
Téléchargez le fichier de page avec un nom "propre", par exemple. mypage
et définissez le Content-Type
défini sur text/html
(en tant que message que vous avez lié à décrit). Vous devez renommer le fichier sur votre système avant de le télécharger pour qu’il n’ait pas d’extension, ou renommer sans l’extension sur S3 après le téléchargement. Le nom du fichier sur S3 ne doit pas avoir une extension.
Créez un dossier avec le nom "clean" et chargez le fichier de page dans ce dossier avec son nom défini sur le document d'index default , par exemple. index.html
. Vous devez vérifier quel est le nom du document d'index par défaut. Ceci est défini lorsque vous configurez votre compartiment en tant que site Web, mais peut être modifié ultérieurement.
Si vous ne pouvez pas utiliser ce qui précède, vous pouvez télécharger un nouvel objet de zéro octet avec le nom clé mypage
, puis définir une redirection de page en spécifiant la clé Website Redirect Location
avec une valeur mypage.html
dans les métadonnées au cours du processus de téléchargement. Voir Configuration d'une redirection de page Web dans la documentation Amazon S3.
Vous pouvez également copier le fichier dans un nouvel objet nommé mypage
avec Content-Type
défini sur text/html
.
Comme certains l'ont déjà dit, supprimez l'extension du fichier, mais suivez simplement les étapes suivantes:
Et comme les gens l’ont dit, assurez-vous que vos nouveaux liens dans votre code HTML ne contiennent plus l'extension de fichier .html. Cela a fonctionné pour moi.
Créer un dossier à /mypage
et y mettre index.html
ne fonctionnait pas. Il s’avère que cela est dû au fait que le paramètre "Index Document" de Bucket a été remplacé par myindex.html
:
Bucket Properties --> Static Website Hosting --> Enable Website Hosting --> Index Document
Cela s'appliquait également à tous les sous-dossiers, de sorte qu'il ne cherchait pas /mypage/index.html
lorsqu'il se trouvait sur la route /mypage
; il recherchait plutôt /mypage/myindex.html
.
J'ai simplement rétabli le paramètre myindex.html
en index.html
et la structure de dossiers standard fonctionne. Il aurait tout aussi bien fonctionné d’utiliser des fichiers myindex.html
partout avec cette mise en place, mais cela semblait déroutant sans gain réel.
Je ne sais toujours pas pourquoi régler Content-Type
sur text/html
ne fonctionne pas - il semble que ce soit le cas, comme cela est mentionné à plusieurs endroits.
Quoi qu'il en soit, le problème est résolu en modifiant le Index Document
du Bucket et tous les sous-dossiers en utilisant index.html
.
Avec l'AWS CLI:
En supposant que vous ayez supprimé l'extension du nom de fichier et configuré AWS CLI avec votre compte, vous pouvez définir les métadonnées du fichier en exécutant cette commande dans votre console:
aws s3 cp /path/to/file s3://yourwebsite.com --content-type 'text/html' --acl public-read
Solution très simple et testée. :
Une autre solution possible consiste à utiliser Lambda @ Edge power, référence de la documentation ici .
Pour ceux qui utilisaient des collections, j’ai été en mesure de rendre les liens plus jolis en ajoutant un caractère /
collections:
my_collection:
output:true
permalink: /:collection/:path/