Comment pouvez-vous définir une valeur par défaut de l'objet racine de sous-répertoires pour un statiquement site web hébergé sur Cloudfront?
Comment pouvez-vous définir une valeur par défaut de l'objet racine de sous-répertoires sur un statiquement site web hébergé sur Cloudfront? Plus précisément, j'aimerais www.example.com/subdir/index.html
pour être servi, chaque fois que l'utilisateur demande www.example.com/subdir
. Remarque, c'est pour livrer un site web statique détenus dans un compartiment S3. En outre, je voudrais utiliser une origine de l'accès à l'identité de restreindre l'accès au compartiment S3 à seulement Cloudfront.
Maintenant, je suis conscient que Cloudfront fonctionne différemment de la S3 et amazon états plus précisément:
Le comportement de CloudFront racine par défaut des objets est différente de la
le comportement d'Amazon S3 index des documents. Lorsque vous configurez un Amazon S3
seau comme un site web et de spécifier l'index de document, Amazon S3 retourne
l'indice de document, même si un utilisateur demande un sous-répertoire dans le
seau. (Une copie du document d'index doit apparaître dans chaque
sous-répertoire.) Pour plus d'informations sur la configuration d'Amazon S3
les seaux que les sites web et sur l'indice de documents, voir l'Hébergement
Sites internet sur Amazon S3 chapitre dans l'Amazon Simple Storage Service
Guide Du Développeur.
En tant que tel, même si Cloudfront nous permet de spécifier une valeur par défaut de l'objet racine, cela ne fonctionne que pour www.example.com
et pas pour www.example.com/subdir
. Afin de contourner cette difficulté, nous pouvons changer l'origine de nom de domaine pour pointer vers le site web de l'extrémité donné par S3. Cela fonctionne très bien et permet à la racine des objets pour être spécifiée de manière uniforme. Malheureusement, cela ne semble pas être compatible avec l'origine de l'accès des identités. Plus précisément, les liens ci-dessus, les états:
Passer en mode d'édition:
Web distributions – Cliquez sur les Origines de l'onglet, cliquez sur l'origine que vous souhaitez modifier et cliquez sur modifier. Vous ne pouvez créer qu'une origine de l'accès
d'identité pour les origines dont l'Origine est de Type S3 Origine.
Fondamentalement, dans le but de régler les paramètres par défaut de la racine de l'objet, nous utilisons le S3 du site web d'extrémité, et non le site web de seau d'elle-même. Ce n'est pas compatible avec l'aide de l'origine de l'accès à l'identité. En tant que tel, mes questions se résume soit à
-
Est-il possible de spécifier une valeur par défaut de l'objet racine de tous les sous-répertoires pour un statiquement site web hébergé sur Cloudfront?
-
Est-il possible de configurer l'origine de l'accès à l'identité du contenu servi de Cloudfront où l'origine est un S3 site web d'extrémité, et non un compartiment S3?
- Je pense que c'est maintenant faisable avec un Lambda@edge, à l'aide d'une fonction qui permet de rediriger toutes les Url se terminant en / de /index.html je vais l'essayer sur mon site et d'en faire rapport, les résultats et après la configuration détaillée comme une réponse.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: Il semble que j'ai été incorrect! Voir JBaczuk de la réponse, qui doit être accepté de répondre sur ce fil.
Malheureusement, la réponse à vos deux questions est non.
1. Est-il possible de spécifier une valeur par défaut de l'objet racine de tous les sous-répertoires pour un statiquement site web hébergé sur Cloudfront?
Pas. Comme indiqué dans le AWS CloudFront docs...
2. Est-il possible de configurer l'origine de l'accès à l'identité du contenu servi de Cloudfront où l'origine est un S3 site web d'extrémité, et non un compartiment S3?
Pas directement. Vos origines avec CloudFront sont S3 ou votre propre serveur.
C'est cette deuxième option qui n'ouvrent des possibilités intéressantes, cependant. C'est probablement ce qui défait le but de ce que vous essayez de faire, mais vous pouvez configurer votre propre serveur dont la seule tâche est d'être un CloudFront serveur d'origine.
Lorsqu'une demande arrive pour http://d111111abcdef8.cloudfront.net/install/, CloudFront va transmettre cette demande à votre serveur d'origine, en demandant
/install
. Vous pouvez configurer votre serveur d'origine mais vous voulez, y compris pour servirindex.html
dans ce cas.Ou vous pourriez écrire une petite application web qui prend tout de cet appel et obtient directement à partir de S3 de toute façon.
Mais je me rends compte que la mise en place de votre propre serveur et de se préoccuper de mise à l'échelle, il peut vaincre le but de ce que vous essayez de faire en premier lieu.
Il EST une façon de le faire. Au lieu de pointer vers votre seau en le sélectionnant dans la liste déroulante (www.example.com.s3.amazonaws.com), point à la statique de domaine de votre seau (par exemple. http://www.example.com.s3-website-us-west-2.amazonaws.com):
Grâce à Cette AWS fil de discussion du Forum
/
et l'utilisateur oublie le dernier/
comme/blog
vs/blog/
puis S3 sera rediriger vers[origin path]/blog/
HTTPS
seulement?www.example.com.s3-website-us-west-2.amazonaws.com
devrait êtrewww.example.com.s3-website.us-west-2.amazonaws.com
, de l'avis du tableau de bord à point changer après las3-website
.website_endpoint
(C. F. terraform.io/docs/providers/aws/d/s3_bucket.html). Attention: vous devrez également mettre à jour leorigin
paramètres de votre distribution CloudFront (C. F. terraform.io/docs/fournisseurs/aws/r/...): en effet, par défaut, si rien n'est spécifié, c'est un S3 d'Origine, mais vous avez maintenant besoin d'une Coutume d'Origine.Activation S3 hébergement signifie que vous devez ouvrir le seau pour le monde. Dans mon cas, j'avais besoin de garder le seau privé et l'utilisation de l'origine de l'accès à l'identité de la fonctionnalité de restreindre l'accès à Cloudfront seulement. Comme @Juissi suggéré, une fonction Lambda peut fixer les redirections:
Après la publication de votre fonction, allez dans votre distribution cloudfront dans la console AWS. Aller à
Behaviors
, puis choisissezOrigin Request
sousLambda Function Associations
, et enfin de coller l'ARN pour votre nouvelle fonction.Il y en a un autre moyen pour obtenir un fichier par défaut servi dans un sous-répertoire, comme
example.com/subdir/
. Vous pouvez réellement (par programmation) stocker un fichier avec la clésubdir/
dans le seau. Ce fichier pas apparaître dans la S3 de la console de gestion, mais il existe réellement, et CloudFront servir.Solution de contournement pour le problème est d'utiliser lambda@edge pour la réécriture de requêtes. On a juste besoin d'installation de la lambda pour la distribution CloudFront de la visionneuse de la demande de l'événement et de réécrire tout ce qui se termine par " /" ET n'est pas égal à '/' à défaut de la racine du document par exemple index.html.
Je sais que c'est une vieille question, mais j'ai juste eu du mal à moi-même. En fin de compte, mon but était moins de définir une valeur par défaut de fichiers dans un répertoire, et de plus pour avoir le résultat final d'un fichier qui a été servi sans
.html
à la fin de laJ'ai fini par enlever
.html
à partir du nom de fichier et par programmation/définir manuellement le type mime àtext/html
. Ce n'est pas la manière traditionnelle, mais il ne semble pas de travail et qui répond à mes besoins pour la jolie url, sans sacrifier les avantages de cloudformation. Réglage du type mime est ennuyeux, mais un petit prix à payer pour les avantages à mon avisIl y a un "officielles" guide publié sur AWS blog qui recommande la création d'un Lambda@Bord de la fonction déclenchée par votre distribution CloudFront:
Suivez le guide ci-dessus pour voir toutes les étapes nécessaires pour configurer cela, y compris un compartiment S3, distribution CloudFront et Lambda@Edge fonction de la création.
Une autre alternative à l'utilisation de lambda@edge est d'utiliser CloudFront pages d'erreur. Configurer un Réponse D'Erreur Personnalisé pour envoyer tous 403 du à un fichier spécifique. Puis ajouter du javascript à ce fichier pour ajouter index.html pour les url qui se terminent en /. Exemple de code: