Pourquoi l'emplacement de redirection du site Web S3 n'est pas suivi par CloudFront?

18

J'ai un site Web hébergé sur Amazon S3. Il s'agit de la nouvelle version d'un ancien site Web hébergé sur WordPress.

J'ai configuré certains fichiers avec les métadonnées Website Redirect Locationpour gérer l'ancien emplacement et les rediriger vers les nouvelles pages du site Web.

Par exemple: je devais http://www.mysite.com/solutionrediriger vers http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlDonc j'ai créé un fichier vide nommé à l' solutionintérieur de mon compartiment avec les métadonnées correctes:

Website Redirect Location= /product.html

Les métadonnées de redirection S3 sont équivalentes à celles 301 Moved Permanentlyqui sont idéales pour le référencement. Cela fonctionne très bien lors de l'accès à l'URL directement à partir du domaine S3.

J'ai également mis en place une distribution CloudFront basée sur le compartiment du site Web. Et quand j'essaye d'accéder via ma distribution, la redirection ne fonctionne pas, c'est à dire:

http://xxxx123.cloudfront.net/solution ne redirige pas mais télécharge le fichier vide à la place.

Ma question est donc de savoir comment conserver la redirection via la distribution CloudFront? Ou une idée sur la façon de gérer la redirection sans détériorer le référencement?

Merci

Yannick Chaze
la source

Réponses:

47

J'ai rencontré ce problème récemment et j'ai trouvé une solution de contournement qui semblait fonctionner.

J'ai créé une distribution Cloudfront avec une origine personnalisée pointant vers le nom d'hôte du site Web statique S3 au lieu du nom d'hôte du compartiment. Dans le cas du PO, l'origine souhaitée serait.

mysite.s3-website-us-east-1.amazonaws.com

Frapper une distribution Cloudfront en utilisant simplement le compartiment comme origine ne fonctionne pas car le compartiment ne sert pas réellement les redirections. Il ne sert que des fichiers et stocke des métadonnées.

J'espère que cela pourra aider.

bmatsuo
la source
Notez cependant que Cloudfront met en cache la réponse de redirection au lieu de la suivre. Par conséquent, les téléchargements de ressources que vous redirigez pour contourner Cloudfront.
tfischbach
2
bmatsuo - Si nous pouvions vous donner un milliard de points de répétition pour cela, nous le ferions. Merci beaucoup. Vous avez vraiment sauvé la journée.
snipe
Cela a beaucoup aidé! Il convient de mentionner pour toute personne nouvelle dans S3: pour créer un compartiment statique, accédez à votre compartiment et visitez l'onglet Propriétés. Cliquez sur Hébergement de sites Web statiques. Cela vous donnera l'URL correcte qui permettra le transfert :)
rick6
2

Une analyse

Selon le comportement documenté des demandes et des réponses et les codes d'état HTTP pris en charge pour les origines personnalisées , Amazon CloudFront ne suit malheureusement pas les redirections :

[...] Après avoir configuré la redirection, la première fois qu'un utilisateur final soumet une demande pour l'objet, CloudFront Front envoie la demande à l'origine et l'origine répond avec une redirection (par exemple, 302 Déplacé temporairement). CloudFront met en cache la redirection et la renvoie à l'utilisateur final. CloudFront ne suit pas la redirection. [c'est moi qui souligne]

Bien sûr, vous utilisez Amazon S3 plutôt qu'une origine personnalisée, et une section connexe est notamment absente du comportement de demande et de réponse pour Amazon S3 Origins , mais étant donné que les redirections Amazon S3 n'ont été ajoutées que récemment (voir Amazon S3 - Support for Website Redirections ), il se peut qu'il manque encore là.

En conséquence, je suppose que vous ne recevez pas un fichier vide avec le code d'état HTTP 200 OK , plutôt un état HTTP 301 Déplacé de manière permanente sans aucun corps - avez-vous réellement vérifié cela avec un navigateur ou éventuellement uniquement avec un outil de ligne de commande comme par exemple cURL ou HTTPie ? Ces derniers outils nécessitent généralement un paramètre explicite pour suivre les redirections, ce qui peut facilement passer inaperçu.

Solution potentielle

Si l'analyse s'avère correcte, vous devez configurer la redirection pour cibler explicitement CloudFront à la place, voir à nouveau les redirections :

Vous pouvez configurer votre serveur Web pour rediriger les demandes vers l'un des emplacements suivants:

  • La nouvelle URL de l'objet sur le serveur d'origine. Lorsque l'utilisateur final suit la redirection vers la nouvelle URL, l'utilisateur final contourne CloudFront et va directement à l'origine. Par conséquent, nous vous recommandons de ne pas rediriger les demandes vers la nouvelle URL de l'objet sur l'origine.

  • La nouvelle URL CloudFront de l'objet. Lorsque l'utilisateur final soumet la demande qui contient la nouvelle URL CloudFront, CloudFront récupère l'objet du nouvel emplacement sur votre origine, le met en cache à l'emplacement périphérique et renvoie l'objet à l'utilisateur final. Les demandes ultérieures pour l'objet seront servies par l'emplacement périphérique. Cela évite la latence et la charge associées aux téléspectateurs qui demandent l'objet à l'origine. Cependant, chaque nouvelle demande pour l'objet entraînera des frais pour deux demandes à CloudFront.

Steffen Opel
la source
Lorsque je cURL l'URL qui doit être redirigée via la distribution CloudFront, je reçois: HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 Ma compréhension est que la redirection est gérée par S3 et dans ce cas, le fichier est hébergé par CloudFront et il ne se soucie pas des en-têtes de redirection définis pour S3 comme S3 est le serveur Web du fichier, je ne peux pas mapper la redirection autrement qu'avec les métadonnées.
Yannick Chaze