Una CDN eliminó GZIP y produjo mojibake en los nombres de archivos y la aplicación del encabezado del juego de caracteres que solucionó las descargas corruptas.

Publicado: 2025-11-21

Cuando los sitios web de gran escala dependen de una infraestructura global para entregar contenido de manera confiable y eficiente, las redes de entrega de contenido (CDN) desempeñan un papel fundamental. Más allá de simplemente almacenar en caché los activos más cerca de los usuarios, las CDN también ayudan a comprimir archivos, acelerar las descargas y mejorar la experiencia del usuario. Sin embargo, bajo ciertas condiciones, pueden introducir nuevos problemas sin darse cuenta. Uno de esos incidentes involucró compresión GZIP y conjuntos de caracteres manejados incorrectamente, lo que provocó descargas corruptas y mojibake (texto confuso) en los nombres de archivos, un fenómeno que desafió tanto a los desarrolladores como a los operadores.

TL;DR: Una mala configuración en un servicio CDN llevó a que se eliminaran los encabezados de compresión GZIP de los archivos descargables y a que se malinterpretara la codificación de caracteres de los nombres de archivos. Esto resultó en descargas con nombres de archivos corruptos o ilegibles (mojibake). El problema finalmente se resolvió forzando el charset correcto en los encabezados HTTP, asegurando que el navegador interpretara correctamente tanto la codificación del nombre de archivo como el contenido. Este caso resalta la importancia de la coherencia en la codificación del contenido, especialmente cuando se utilizan CDN que pueden modificar los encabezados HTTP.

Qué salió mal: mala gestión de la compresión

El meollo del problema fue el manejo inadecuado por parte de la CDN del encabezado Content-Encoding . El servidor de origen comprimió correctamente los archivos usando GZIP y los etiquetó con el siguiente encabezado:

 Content-Encoding: gzip

Sin embargo, la CDN, destinada a optimizar la entrega, decidió eliminar este encabezado y mostrar el contenido como si no estuviera comprimido. Esto funcionó bien para los navegadores que esperaban archivos sin formato como CSS o JavaScript, pero cuando los usuarios intentaron descargar archivos como CSV, PDF o ZIP, recibieron descargas corruptas. Descomprimir dichos archivos falló por completo o produjo datos que parecían ilegibles o incompletos.

Más allá de la corrupción binaria, surgió un problema aún más misterioso: algunos nombres de archivos aparecían distorsionados con símbolos extraños, particularmente cuando se descargaban usando navegadores como Chrome o Firefox. Este fenómeno se conoce como mojibake y ocurre cuando un programa interpreta una secuencia de bytes utilizando una codificación de caracteres no deseada.

Confusión en las codificaciones de caracteres

Mojibake en los nombres de archivos descargados suele ocurrir cuando:

  • El nombre del archivo contiene caracteres que no son ASCII (como letras acentuadas o escrituras asiáticas)
  • El navegador no sabe qué juego de caracteres usar
  • Los encabezados Content-Disposition o Content-Type carecen de declaraciones de juego de caracteres adecuadas

El navegador, al adivinar mal, intenta interpretar el nombre del archivo utilizando una codificación predeterminada o alternativa como ISO-8859-1, lo que genera galimatías en lugar de caracteres legibles. Esto suele afectar a los usuarios que descargan archivos con nombres en idiomas como japonés, ruso o alemán, donde prevalecen los caracteres especiales.

Originalmente, los desarrolladores habían configurado encabezados apropiados desde el servidor de aplicaciones, como por ejemplo:

 Content-Type: application/octet-stream; charset=utf-8 Content-Disposition: attachment; filename="resume.pdf"

Pero, una vez más, la CDN alteró estos encabezados eliminándolos o reemplazándolos, lo que provocó descargas sin la sugerencia del conjunto de caracteres. Esto provocó un comportamiento incorrecto del navegador ya que el nombre del archivo se interpretó con una codificación incorrecta.

La solución: aplicar el juego de caracteres en los encabezados HTTP

Después de mucha depuración y seguimiento de registros, los desarrolladores confirmaron que:

  • Los archivos no estaban dañados en el servidor de origen.
  • Las descargas se realizaron correctamente mediante curl y acceso IP directo.
  • El problema solo ocurrió cuando se entregó a través de la CDN.

Por tanto, la solución adecuada era doble:

  1. Obligue a la CDN a conservar los encabezados Content-Encoding para que los navegadores reciban y descompriman el contenido GZIP correctamente.
  2. Establezca charset explícito tanto en Content-Type como en los encabezados Content-Disposition para garantizar la decodificación adecuada del nombre de archivo internacional.

La configuración final del encabezado de trabajo se veía así:

 Content-Type: application/octet-stream; charset=utf-8 Content-Disposition: attachment; filename*=UTF-8''r%C3%A9sum%C3%A9.pdf Content-Encoding: gzip

El uso de filename* con sintaxis de codificación URL UTF-8'' garantiza que los navegadores interpreten el nombre de archivo de acuerdo con RFC 5987. Esto es particularmente compatible con los navegadores modernos, alineando el comportamiento multiplataforma.

Por qué las CDN modifican los encabezados

Las CDN suelen tener como objetivo optimizar el rendimiento, reducir la redundancia y estandarizar las respuestas. A tal efecto podrán:

  • Quitar o reemplazar las directivas de compresión.
  • Normalizar tipos de contenido
  • Eliminar encabezados que no pasan filtros de seguridad o reglas de almacenamiento en caché

Sin embargo, estas optimizaciones pueden resultar contraproducentes cuando anulan parámetros cuidadosamente establecidos y críticos para la representación de contenido o la descarga de archivos. En este incidente, el hecho de que la CDN no preservara la Content-Encoding y charset correctos resultó perjudicial tanto para la usabilidad como para la internacionalización.

Lecciones aprendidas

Este problema sirve como un valioso recordatorio para los desarrolladores que trabajan en entornos distribuidos:

  • Pruebe siempre la entrega de contenido de un extremo a otro. Los archivos que funcionan en su servidor pueden comportarse de manera diferente detrás de una CDN.
  • Sea explícito en los encabezados. No asuma nada sobre los comportamientos predeterminados: declare siempre el tipo de contenido, la codificación y el juego de caracteres.
  • Controle el comportamiento de CDN a través de la configuración. La mayoría de las CDN permiten anulaciones o reglas para preservar los encabezados. Utilízalos.
  • Verifique el comportamiento de descarga en múltiples navegadores y configuraciones regionales. Los errores de internacionalización suelen aparecer sólo en estas condiciones.

Preguntas frecuentes

¿Qué es el mojibake?

Mojibake es un término utilizado para describir la visualización confusa o incorrecta de caracteres causada por discrepancias en la codificación de caracteres. A menudo ocurre cuando el software malinterpreta la codificación de caracteres utilizada para almacenar o enviar datos de texto.

¿Cómo afecta gzip a las descargas de archivos?

Cuando se usa correctamente, GZIP comprime archivos para reducir el tiempo de descarga. Sin embargo, si un archivo se entrega comprimido con GZIP y carece del encabezado Content-Encoding: gzip adecuado, es posible que los navegadores no lo descompriman, lo que provocará descargas corruptas o ilegibles.

¿Por qué una CDN eliminaría encabezados como Content-Encoding o charset?

Las CDN priorizan el rendimiento y la seguridad. Al hacerlo, a menudo normalizan los encabezados o aplican políticas que eliminan información potencialmente insegura o innecesaria. Esto puede eliminar sin darse cuenta metadatos críticos necesarios para el manejo correcto del contenido.

¿Cuál es la forma correcta de especificar nombres de archivos que no sean ASCII para las descargas?

Utilice el encabezado Content-Disposition con el atributo filename* usando codificación UTF-8 y formato de escape porcentual, como se especifica en RFC 5987. Por ejemplo:

Content-Disposition: attachment; filename*=UTF-8''r%C3%A9sum%C3%A9.pdf

¿Cómo pueden los desarrolladores evitar estos problemas en el futuro?

Deben realizar pruebas a través de la capa CDN, especificar encabezados explícitamente y hacer uso de configuraciones CDN que preserven o pasen todos los metadatos requeridos. Además, mantener la documentación actualizada sobre cómo las CDN alteran el tráfico es esencial durante las fases de depuración.