Tengo un dominio example.com . Tengo un depósito S3 llamado configuración de example.com con un archivo index.html que funciona. Ahora me gusta crear dos subcarpetas llamadas old y new , cada una de las cuales contiene una versión separada de una aplicación de una sola página. Solicitar https://example.com/old (me gusta omitir index.html al ingresar la solicitud en la barra de direcciones del navegador) abriría el archivo index.html en la subcarpeta old y solicitaría https://example.com/new abriría index.html . ¿Cuál es la mejor manera de hacer estas redirecciones? ¿Debo configurar algo en Route 53 example.com/old -> example.com/old/index.html o hay una mejor manera de hacerlo?
No es necesario que una función lambda agregue gastos y complejidad a su proyecto.
La siguiente respuesta se cita de https://stevepapa.com/
Se esperaría que
https://stevepapa.com/my-great-new-post/funcione de la misma manera que:https://stevepapa.com/my-great-new-post/index.htmlHay una pequeña forma inteligente de hacer que fluyan a través de la distribución de Cloudfront, e implica cambiar el origen de la fuente del que Cloudfront le presenta de forma predeterminada.
Al seleccionar la fuente de origen, Cloudfront le mostrará una lista de depósitos S3.
En lugar de configurar la fuente desde el depósito que se muestra en la lista desplegable, deberá obtener el punto final de alojamiento web estático para ese recurso desde su página de configuración de S3 e ingresarlo manualmente.
El uso de la fuente estática para el origen de distribución de Cloudfront significa que cualquier solicitud a esa distribución utilizará la búsqueda de objetos raíz de S3, y sus respuestas 404 deberían desaparecer a medida que fluyen las referencias.
Después de hacer esto:
De lo contrario, los cambios que realizó no se publicarán de inmediato.
Así que tuve este problema anoche también.
El problema es el siguiente: S3, cuando se configura como un cubo de sitio web, perdona y tiene la configuración de documento de índice, establecida en index.html y esto se aplica en la raíz, es decir, example.com en realidad se redirige a example.com/index.html , y también se aplica en el nivel de subcarpeta, por lo que example.com/new o example.com/new/ deberían redirigir a example.com/new/index.html , donde habría un objeto en el depósito. (Si no, obtendría un error NoSuchKey en su lugar).
Sin embargo, luego se "actualiza" a CloudFront, probablemente para HTTPS, y esta característica desaparece. En cambio, CloudFront realiza llamadas API explícitas a S3 y, por lo tanto, no activa la concesión del documento de índice. Funciona para la raíz, pero no para las subcarpetas.
La solución RoutingRules no me parece clara porque al especificar KeyPrefixEquals en lugar de la clave exactamente igual (que no existe), creo que obtendría coincidencias no deseadas.
En su lugar, implementé una regla de Lambda@Edge que reescribe la solicitud que CloudFront hace a S3 para tener un valor de clave adecuado.
Comience con los documentos de Lambda y el ejemplo de prueba A/B aquí: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-general-examples
Cambia el código a:
'use strict'; exports.handler = (event, context, callback) => { /* * Expand S3 request to have index.html if it ends in / */ const request = event.Records[0].cf.request; if ((request.uri !== "/") /* Not the root object, which redirects properly */ && (request.uri.endsWith("/") /* Folder with slash */ || (request.uri.lastIndexOf(".") < request.uri.lastIndexOf("/")) /* Most likely a folder, it has no extension (heuristic) */ )) { if (request.uri.endsWith("/")) request.uri = request.uri.concat("index.html"); else request.uri = request.uri.concat("/index.html"); } callback(null, request); };Y publíquelo en su distribución de CloudFront.
Hay una manera aún más fácil de lograr esto con un archivo de redirección HTML
Cree un archivo sin formato llamado my-great-new-post (no se preocupe, no habrá un conflicto de nombres con la carpeta en el mismo depósito)
Escriba un código de meta-redireccionamiento en ese archivo (pegué el código a continuación)
cargue el archivo en el depósito raíz (donde se encuentra la carpeta my-great-new-post)
modificar los metadatos del nuevo archivo y hacer Content-Type:text/html
Aquí está el contenido del archivo:
<!DOCTYPE html> <html> <head> <meta http-equiv="refresh" content="0; url=/my-great-new-post/index.html"> </head> <body> </body> </html>