¿Por qué CloudFront no sigue la ubicación de redireccionamiento del sitio web de S3?

18

Tengo un sitio web alojado en Amazon S3. Es la nueva versión de un antiguo sitio web alojado en WordPress.

He configurado algunos archivos con los metadatos Website Redirect Locationpara manejar la ubicación anterior y redirigirlos a las nuevas páginas del sitio web.

Por ejemplo: tenía http://www.mysite.com/solutionque quiero redirigir a http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlAsí que creé un archivo vacío llamado solutiondentro de mi cubo con los metadatos correctos:

Website Redirect Location= /product.html

Los metadatos de redireccionamiento S3 son equivalentes a uno 301 Moved Permanentlyque es excelente para SEO. Esto funciona muy bien cuando se accede a la URL directamente desde el dominio S3.

También he configurado una distribución de CloudFront basada en el depósito del sitio web. Y cuando intento acceder a través de mi distribución, la redirección no funciona, es decir:

http://xxxx123.cloudfront.net/solution no redirige, sino que descarga el archivo vacío.

¿Entonces mi pregunta es cómo mantener la redirección a través de la distribución de CloudFront? ¿O alguna idea sobre cómo manejar la redirección sin deteriorar el SEO?

Gracias

Yannick Chaze
fuente

Respuestas:

47

Me encontré con este problema recientemente y encontré una solución que parecía funcionar.

Creé una distribución de Cloudfront con un origen personalizado que apunta al nombre de host del sitio web estático S3 en lugar del nombre de host del depósito. En el caso del OP, el origen deseado sería.

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

Alcanzar una distribución de Cloudfront simplemente usando el depósito como origen no funciona porque el depósito en realidad no sirve redireccionamientos. Solo sirve archivos y almacena metadatos.

Espero que ayude.

bmatsuo
fuente
Sin embargo, tenga en cuenta que Cloudfront almacena en caché la respuesta de redireccionamiento en lugar de seguirla. En consecuencia, las descargas de recursos que redirige para evitar Cloudfront.
tfischbach
2
bmatsuo: si pudiéramos darte mil millones de puntos de repetición por esto, lo haríamos. Muchas gracias. Realmente salvaste el día.
Snipe
¡Esto ayudó mucho! Vale la pena mencionar para cualquier persona nueva en S3: para crear un depósito estático, vaya a su depósito y visite la pestaña Propiedades. Haga clic en Alojamiento de sitios web estático. Eso le dará la URL correcta que permitirá el reenvío :)
rick6
2

Análisis

De acuerdo con el comportamiento documentado de solicitud y respuesta y los códigos de estado HTTP admitidos para orígenes personalizados , Amazon CloudFront no sigue los redireccionamientos , desafortunadamente:

[...] Después de configurar la redirección, la primera vez que un usuario final envía una solicitud para el objeto, CloudFront Front envía la solicitud al origen, y el origen responde con una redirección (por ejemplo, 302 movido temporalmente). CloudFront almacena en caché la redirección y la devuelve al usuario final. CloudFront no sigue la redirección. [énfasis mío]

Por supuesto, está utilizando Amazon S3 en lugar de un origen personalizado, y una sección relacionada está notablemente ausente del comportamiento de solicitud y respuesta para los orígenes de Amazon S3 , pero dado que las redirecciones de Amazon S3 solo se han agregado recientemente (consulte Amazon S3 - Soporte para el sitio web Redireccionamientos ), podría faltar todavía allí.

En consecuencia, me atrevo a suponer que no está recibiendo un archivo vacío con el código de estado HTTP 200 OK , sino un estado HTTP 301 movido permanentemente sin ningún cuerpo: ¿ha verificado esto realmente con un navegador o eventualmente solo con una herramienta de línea de comandos como por ejemplo, cURL o HTTPie ? Las últimas herramientas generalmente requieren un parámetro explícito para seguir los redireccionamientos, por lo que esto podría pasar desapercibido fácilmente.

Solucion potencial

Si el análisis resulta correcto, deberá configurar la redirección para apuntar explícitamente a CloudFront en su lugar, nuevamente vea Redirecciones :

Puede configurar su servidor web para redirigir las solicitudes a una de las siguientes ubicaciones:

  • La nueva URL del objeto en el servidor de origen. Cuando el usuario final sigue la redirección a la nueva URL, el usuario final omite CloudFront y va directamente al origen. Como resultado, le recomendamos que no redirija las solicitudes a la nueva URL del objeto en el origen.

  • La nueva URL de CloudFront para el objeto. Cuando el usuario final envía la solicitud que contiene la nueva URL de CloudFront, CloudFront obtiene el objeto de la nueva ubicación en su origen, lo almacena en caché en la ubicación del borde y devuelve el objeto al usuario final. Las solicitudes posteriores para el objeto serán atendidas por la ubicación del borde. Esto evita la latencia y la carga asociadas con los espectadores que solicitan el objeto desde el origen. Sin embargo, cada nueva solicitud del objeto incurrirá en cargos por dos solicitudes a CloudFront.

Steffen Opel
fuente
Cuando curro la URL que debe ser redirigida a través de la distribución de CloudFront, obtengo: HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 Entiendo que la redirección es administrada por S3 y en este caso el archivo está alojado por CloudFront y no le importan los encabezados de redirección establecidos para S3 como S3 es el servidor web del archivo No puedo asignar la redirección que no sea con los metadatos.
Yannick Chaze