Tengo un sitio generado estáticamente que cargué en S3 y emergí a través de una distribución de Cloudfront: tiene un archivo raíz index.html y varias subpáginas generadas estáticamente (por ejemplo /donate/index.html ). Configuré el depósito para que actúe como un host estático con index.html como documento de índice. Y puedo visitar estas páginas visitando el prefijo S3 directamente, por ejemplo, /donate/ muestra correctamente el html en /donate/index.html .
Aquí está el problema: cuando me vinculo a /donate?some=query¶m=here S3 automáticamente redirige 302 estas páginas sin una barra inclinada final a la página con la barra inclinada final, eliminando los parámetros de consulta que usa mi javascript del lado del cliente para rastrear ligeramente el estado .
Por ejemplo /donate?some=query¶m=here 302s a /donate/ y pierde ese contexto, lo que dificulta que la gente construya URL porque deben recordar incluir la barra inclinada final (HTTP 302 también es una mala respuesta http si desea que la web rastreadores para recordar la nueva ruta).
Esto es lo que no funcionó:
Esto es lo que finalmente lo descifró: crear una función Cloudfront de solicitud de espectador para verificar manualmente si la ruta no contiene una extensión de archivo ni una barra inclinada final y agregar una en esos casos.
function handler (event) { var request = event.request; var uri = request.uri; if( !uri.includes('.') && !uri.endsWith('/') ) { request.uri = uri + '/' } return request; };Cree esta función en Cloudfront (Cloudfront > Funciones > Crear función) y luego adjúntela al comportamiento de su distribución (Cloudfront > Distribución > Comportamiento > Editar > Solicitud del espectador > Funciones de Cloudfront).
Asegúrese de invalidar el sitio después de que la distribución haya terminado de inicializarse con la nueva configuración y pruebe la nueva ruta a través de CURL; debería ver el siguiente cambio de comportamiento:
# BEFORE: curl -v --location http://example.com/donate?please=keep > /dev/null > GET /donate?please=keep > RESP 302 > GET /donate/ > RESP 200 # AFTER curl -v --location http://example.com/donate?please=keep > /dev/null > GET /donate?please=keep > RESP 200¿Hay otra manera? ¿Me arrepentiré de haber pagado por cada invocación de función de Cloudfront? ¿Hay alguna manera de hacer que esto suceda con cambios de política puramente de Cloudfront o S3?