Amazon Cloudfront con S3 Redirect

10

Estoy tratando de hacer algo que debería ser relativamente sencillo: quiero configurar algunos dominios y subdominios para redirigir al dominio principal de nuestro sitio, pero quiero poner los redireccionamientos en Cloudfront. Todo funciona, excepto redirigir la ruta raíz, que me da un archivo XML que describe en parte el bucket de S3.

Antecedentes

S3

S3 le permite configurar un cubo de redireccionamiento completo , como:

S3 con Redireccionar todas las solicitudes de configuración

Al probar esto, el punto final web (brass9-com.s3-website-us-west-1.amazonaws.com) hace lo que debería: redirige a brass9.com. Bueno.

Frente a la nube

Cloudfront le permite apuntar a un depósito S3, pero la forma en que sugiere que lo haga es incorrecto: en lugar de señalar el depósito por su nombre, como brass9-com.s3.amazonaws.com, debe usar el Punto final web anterior. Aparte de eso, puede dejar todo en sus valores predeterminados y obtener un buen comportamiento de redireccionamiento. Entonces, una ruta como www.brass9.com/portfolio redirige correctamente a donde debería. También bueno.

El problema: la redirección del dominio raíz

Lo único que luego no funciona es redirigir desde www.brass9.com . En lugar de obtener una redirección, obtiene este resultado extraño:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

OKAY... . Por lo tanto, esto no es completamente inesperado , porque no hay un objeto raíz predeterminado. Pero, ¿qué objeto raíz predeterminado podría especificar para evitar este comportamiento? ¿Cuál es el nombre del objeto de redireccionamiento S3, si corresponde, al que necesito señalar? ¿O hay alguna otra configuración adecuada, o es solo un error en la forma en que Cloudfront y S3 interactúan que Amazon necesita corregir?

Solución no funcional conocida: objeto raíz predeterminado

Es posible especificar un Objeto raíz predeterminado de index.html, pero no sirve de nada, solo cambia el problema. La URL de Cloudfront en su lugar redirige a /index.html en el sitio principal, que es un 404 (no usamos un archivo index.html, es un sitio basado en el marco del lado del servidor). Podría poner un index.html en el servidor, pero eso derrota la pequeña ganancia de velocidad de usar Cloudfront en primer lugar.

Preguntas similares

Una pregunta plantea algo similar, pero obtiene una respuesta en blanco de 0 bytes por alguna razón en lugar de lo que estoy viendo, una respuesta XML. No incluye una pregunta sobre ese problema o una resolución.

Artículos relacionados

Un artículo propone que solo sirva todo el sitio tanto en el dominio desnudo como en el dominio www . Esto afecta a los marcadores de cualquier usuario, su clasificación de búsqueda, etc., etc. No debe hacer esto.

Varios discuten el alojamiento de un sitio web estático en S3 y Cloudfront en lugar de un esquema de redireccionamiento, por lo que no están relacionados.

Entonces, ¿cómo hago esto correctamente?

Captura de pantalla de la configuración de Cloudfront: sin objeto raíz predeterminado, apuntando al origen S3. Ignorar el InProgress: acababa de activar y desactivar el Objeto raíz predeterminado para probar.

Distribución de Cloudfront sin objeto raíz predeterminado que apunta a S3

Y la configuración de origen para esa distribución:

Origen - apunta a S3, valores predeterminados

Chris Moschini
fuente
1
Cualquier solicitud a un punto final de un sitio web configurado para redirigir todo "debería" hacer exactamente eso, incluida la raíz. ¿Tiene una política de depósito en ese depósito de redireccionamiento? Suena como si pudieras, pero no deberías. También suena un poco como si hubiera podido ver una respuesta en caché de Cloudfront GET /desde antes de corregir su configuración para usar el punto final web.
Michael - sqlbot
1
De hecho, fue una respuesta ListBucket almacenada en caché que aún persistía en S3, a pesar de que había invalidado y cambiado la configuración de CF varias veces. Solo toma una hora o 4 para despejar. @ Michael-sqlbot Si publicas tu comentario como Respuesta, puedo marcarlo como Aceptado.
Chris Moschini

Respuestas:

4

Si tiene este problema, verifique primero cuando configure el origen del depósito s3 para el frente de la nube, el autocompletado devuelve el punto final RES3 s3 domain.amazonaws.com que devuelve esta respuesta ListBucketResult.

Debe escribir manualmente el punto final del sitio web domain.s3-website-region.amazonaws.com

Importante: si ha configurado incorrectamente el frente de la nube con el punto final REST, debe invalidar la memoria caché a través de invalidaciones o seguirá devolviendo la respuesta REST

lapinkoira
fuente
La nota sobre la invalidación de caché finalmente me ayudó a resolver un problema que he perseguido durante varios días. ¡Gracias!
Nate
¡Muchas gracias! Para los usuarios de Terraform, en el originbloque de la distribución, use aws_s3_bucket.BUCKET.website_endpointel domain_name(no bucket_regional_name) y agregue el custom_origin_configbloque.
Dusan
¡Eres un salvavidas! Hemos estado luchando con este problema durante el último día, seguimos recuperando ListBucketResult XML a pesar de que estábamos cambiando la configuración de distribución. Finalmente, después de eliminar la distribución y crear una nueva que apunta a domain.s3-website-region.amazonaws.com, ¡la redirección funcionó para nosotros!
Dale Zak
2

Solución: configure el redireccionamiento como se indica en la pregunta y luego espere los tiempos de caché S3 y CloudFront. Pueden durar 4 horas o más, por lo que solo tiene que configurarlo todo y luego esperar y esperar lo mejor.

(Esta es la solución de Michael de los Comentarios, pero ahora han pasado años y esto realmente merecía ser marcado como Respondido).

Chris Moschini
fuente
0

Escribir como respuesta ya que no puedo comentar: de la documentación en http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements parece que puede tener un objeto raíz predeterminado en blanco:

Si no desea especificar un objeto raíz predeterminado al crear una distribución, incluya un elemento DefaultRootObject vacío.

Dani_l
fuente
Puede (aunque algunas bibliotecas API lo prohíben), pero el uso de un objeto raíz predeterminado en blanco me da la ridícula respuesta XML ListBucketResult que ve en mi pregunta.
Chris Moschini