Los enlaces funcionaban correctamente en local pero no en producción. Por ejemplo:
- ❌
https://pythoncdmx.org/meetups/no funcionaba - ✅
https://pythoncdmx.org/meetups/index.htmlsí funcionaba
El problema se debía a que CloudFront no estaba configurado para manejar URLs sin extensión .html. Cuando MkDocs genera el sitio con use_directory_urls: true, crea URLs como /meetups/ que apuntan a /meetups/index.html, pero CloudFront no sabía cómo resolver estas URLs.
# URL configuration
use_directory_urls: trueSe agregó una función CloudFront que maneja automáticamente las URLs sin extensión:
function handler(event) {
var request = event.request;
var uri = request.uri;
// If the URI ends with a slash, append index.html
if (uri.endsWith('/')) {
request.uri = uri + 'index.html';
}
// If the URI doesn't have an extension, append /index.html
else if (!uri.includes('.') && !uri.endsWith('/')) {
request.uri = uri + '/index.html';
}
return request;
}La función se asoció con todos los cache behaviors de CloudFront para asegurar consistencia.
- mkdocs.yml: Agregada configuración
use_directory_urls: true - terraform/cloudfront.tf:
- Agregada CloudFront Function
url_rewrite - Asociada la función con todos los cache behaviors
- Agregada CloudFront Function
- terraform/cloudfront-staging.tf:
- Aplicada la misma CloudFront Function a staging
- Asociada la función con todos los cache behaviors de staging
Para aplicar estos cambios:
-
Aplicar cambios de Terraform:
cd terraform terraform plan terraform apply -
Desplegar el sitio:
# Los cambios se aplicarán automáticamente en el próximo deploy git push origin main
Después del despliegue, verificar que funcionen:
- ✅
https://pythoncdmx.org/meetups/ - ✅
https://pythoncdmx.org/meetups/index.html - ✅
https://pythoncdmx.org/about/ - ✅
https://pythoncdmx.org/about/index.html
- ✅
https://staging.pythoncdmx.org/meetups/ - ✅
https://staging.pythoncdmx.org/meetups/index.html - ✅
https://staging.pythoncdmx.org/about/ - ✅
https://staging.pythoncdmx.org/about/index.html
- La CloudFront Function se ejecuta en el edge, por lo que tiene latencia mínima
- La función solo modifica la URI si es necesario, sin afectar assets estáticos
- Los cache behaviors mantienen sus configuraciones originales de TTL
- La solución es compatible con el comportamiento existente de MkDocs