Comment définir un objet racine par défaut pour les sous-répertoires sur un site Web hébergé statiquement sur Cloudfront? Plus précisément, j'aimerais www.example.com/subdir/index.html
être servi chaque fois que l'utilisateur le demande www.example.com/subdir
. Notez qu'il s'agit de fournir un site Web statique conservé dans un compartiment S3. De plus, je souhaite utiliser une identité d'accès d'origine pour limiter l'accès au compartiment S3 à Cloudfront uniquement.
Maintenant, je suis conscient que Cloudfront fonctionne différemment des États S3 et Amazon spécifiquement :
Le comportement des objets racine par défaut de CloudFront est différent du comportement des documents d'index Amazon S3. Lorsque vous configurez un compartiment Amazon S3 en tant que site Web et spécifiez le document d'index, Amazon S3 renvoie le document d'index même si un utilisateur demande un sous-répertoire dans le compartiment. (Une copie du document d'index doit apparaître dans chaque sous-répertoire.) Pour plus d'informations sur la configuration des compartiments Amazon S3 en tant que sites Web et sur les documents d'index, consultez le chapitre Hébergement de sites Web sur Amazon S3 dans le Amazon Simple Storage Service Developer Guide.
En tant que tel, même si Cloudfront nous permet de spécifier un objet racine par défaut, cela ne fonctionne que pour www.example.com
et pas pour www.example.com/subdir
. Afin de contourner cette difficulté, nous pouvons changer le nom de domaine d'origine pour qu'il pointe vers le point de terminaison du site Web donné par S3. Cela fonctionne très bien et permet aux objets racine d'être spécifiés de manière uniforme. Malheureusement, cela ne semble pas compatible avec les identités d'accès à l'origine . Plus précisément, les liens ci-dessus indiquent:
Passer en mode édition:
Distributions Web - Cliquez sur l'onglet Origines, cliquez sur l'origine que vous souhaitez modifier, puis sur Modifier. Vous ne pouvez créer une identité d'accès à l'origine que pour les origines dont le type d'origine est Origine S3.
Fondamentalement, pour définir le bon objet racine par défaut, nous utilisons le point de terminaison du site Web S3 et non le compartiment du site Web lui-même. Cela n'est pas compatible avec l'utilisation de l'identité d'accès à l'origine. En tant que tel, mes questions se résument soit à
Est-il possible de spécifier un objet racine par défaut pour tous les sous-répertoires d'un site Web hébergé statiquement sur Cloudfront?
Est-il possible de configurer une identité d'accès à l'origine pour le contenu servi à partir de Cloudfront où l'origine est un point de terminaison de site Web S3 et non un compartiment S3?
Réponses:
MISE À JOUR: Il semble que j'étais incorrect! Voir la réponse de JBaczuk, qui devrait être la réponse acceptée sur ce fil.
Malheureusement, la réponse à vos deux questions est non.
1. Est-il possible de spécifier un objet racine par défaut pour tous les sous-répertoires d'un site Web hébergé statiquement sur Cloudfront?
Non. Comme indiqué dans la documentation AWS CloudFront ...
2. Est-il possible de configurer une identité d'accès à l'origine pour le contenu servi à partir de Cloudfront où l'origine est un point de terminaison de site Web S3 et non un compartiment S3?
Pas directement. Vos options pour les origines avec CloudFront sont les compartiments S3 ou votre propre serveur.
C'est cette deuxième option qui ouvre cependant des possibilités intéressantes. Cela va probablement à l'encontre de l'objectif de ce que vous essayez de faire, mais vous pouvez configurer votre propre serveur dont le seul travail est d'être un serveur d'origine CloudFront.
Lorsqu'une demande arrive pour http://d111111abcdef8.cloudfront.net/install/ , CloudFront transmettra cette demande à votre serveur d'origine, en vous demandant
/install
. Vous pouvez configurer votre serveur d'origine comme vous le souhaitez, y compris pour servirindex.html
dans ce cas.Ou vous pouvez écrire une petite application Web qui prend juste cet appel et l'obtient de toute façon directement à partir de S3.
Mais je me rends compte que la configuration de votre propre serveur et le souci de le mettre à l'échelle peuvent aller à l'encontre de l'objectif de ce que vous essayez de faire en premier lieu.
la source
Il EST une façon de le faire. Au lieu de le pointer vers votre bucket en le sélectionnant dans la liste déroulante (www.example.com.s3.amazonaws.com), pointez-le vers le domaine statique de votre bucket (par exemple www.example.com.s3-website-us -west-2.amazonaws.com):
Merci à ce fil de discussion du forum AWS
la source
HTTPS
uniquement?L'activation de l'hébergement S3 signifie que vous devez ouvrir le seau au monde. Dans mon cas, je devais garder le bucket privé et utiliser la fonctionnalité d'identité d'accès à l'origine pour restreindre l'accès à Cloudfront uniquement. Comme @Juissi l'a suggéré, une fonction Lambda peut corriger les redirections:
Après avoir publié votre fonction, accédez à votre distribution cloudfront dans la console AWS. Allez dans
Behaviors
, puis choisissezOrigin Request
sousLambda Function Associations
et collez enfin l'ARN dans votre nouvelle fonction.la source
Il existe une autre façon d'obtenir un fichier par défaut servi dans un sous-répertoire, comme
example.com/subdir/
. Vous pouvez en fait (par programme) stocker un fichier avec la clésubdir/
dans le compartiment. Ce fichier n'apparaîtra pas dans la console de gestion S3, mais il existe réellement et CloudFront le servira.la source
La solution de contournement du problème consiste à utiliser lambda @ edge pour réécrire les demandes. Il suffit de configurer le lambda pour l'événement de requête de la visionneuse de la distribution CloudFront et de réécrire tout ce qui se termine par «/» ET n'est pas égal à «/» avec le document racine par défaut, par exemple index.html.
la source
Il existe un guide «officiel» publié sur le blog AWS qui recommande de configurer une fonction Lambda @ Edge déclenchée par votre distribution CloudFront:
Suivez le guide lié ci-dessus pour voir toutes les étapes requises pour configurer cela, y compris le compartiment S3, la distribution CloudFront et la création de fonctions Lambda @ Edge .
la source
Une autre alternative à l'utilisation de lambda @ edge consiste à utiliser les pages d'erreur de CloudFront. Configurez une réponse d'erreur personnalisée pour envoyer tous les 403 à un fichier spécifique. Ajoutez ensuite du javascript à ce fichier pour ajouter index.html aux URL qui se terminent par un /. Exemple de code:
la source
Je sais que c'est une vieille question, mais je me suis juste battu moi-même. Finalement, mon objectif était moins de définir un fichier par défaut dans un répertoire, et plus d'avoir le résultat final d'un fichier qui était servi sans
.html
à la fin de celui-ciJ'ai fini par supprimer
.html
du nom de fichier et paramétré par programme / manuellement le type mime surtext/html
. Ce n'est pas la méthode traditionnelle, mais cela semble fonctionner et satisfait mes exigences pour les jolies URL sans sacrifier les avantages de la formation dans le cloud. Le réglage du type mime est ennuyeux, mais un petit prix à payer pour les avantages à mon avisla source