Abe Estrada

AWS CloudFront Default Root Object

El día de hoy descubrí que CloudFront no permite cargar el “Default Root Object” comúnmente apuntando a index.html en subdirectorios, solo en la raíz /.

Existen dos opciones para obtener esta funcionalidad, la primera es habilitar el “bucket” en S3 como “Static website hosting”, pero esto hace que el “bucket” permita el acceso directo y no por medio de CloudFront.

La segunda opción es crear una sencilla función (viewer request) de CloudFront para permitir que si una uri no tiene extensión de archivo o termina en /, automáticamente busque el archivo index.html dentro del subdirectorio indicado, por ejemplo:

http://dominio.com/prueba  -> http://dominio.com/prueba/index.html
http://dominio.com/prueba/ -> http://dominio.com/prueba/index.html

Esta es una solución oficial por parte de AWS, el repositorio se encuentra aquí .

function handler(event) {
    var request = event.request;
    var uri = request.uri;

    // Check whether the URI is missing a file name.
    if (uri.endsWith("/")) {
        request.uri += "index.html";
    }
    // Check whether the URI is missing a file extension.
    else if (!uri.includes(".")) {
        request.uri += "/index.html";
    }

    return request;
}

También existe otra solución oficial utilizando Lambda@Edge , pero creo que con las nuevas funciones de CloudFront es mucho más sencillo.