CDN удалил GZIP и создал моджибаке в именах файлов и принудительном использовании заголовка кодировки, что исправило поврежденные загрузки.

Опубликовано: 2025-11-21

Когда крупномасштабные веб-сайты полагаются на глобальную инфраструктуру для надежной и эффективной доставки контента, сети доставки контента (CDN) играют решающую роль. Помимо простого кэширования ресурсов ближе к пользователям, CDN также помогают сжимать файлы, ускорять загрузку и улучшать взаимодействие с пользователем. Однако при определенных условиях они могут непреднамеренно создать новые проблемы. Один из таких инцидентов был связан с неправильным сжатием GZIP и наборами символов, что привело к повреждению загрузок и моджибаке (искаженному тексту) в именах файлов — явление, которое бросило вызов как разработчикам, так и операторам.

TL;DR: неправильная настройка службы CDN привела к удалению заголовков сжатия GZIP из загружаемых файлов и неправильному пониманию кодировки символов в именах файлов. Это приводило к загрузкам с поврежденными или нечитаемыми именами файлов (mojibake). В конечном итоге проблема была решена путем принудительного использования правильной charset в заголовках HTTP, гарантируя, что браузер правильно интерпретирует как кодировку имени файла, так и содержимое. Этот случай подчеркивает важность согласованности кодирования контента, особенно при использовании CDN, которые могут изменять заголовки HTTP.

Что пошло не так: неправильное управление сжатием

В основе проблемы была неправильная обработка CDN заголовка Content-Encoding . Исходный сервер правильно сжимал файлы с помощью GZIP и помечал их следующим заголовком:

 Content-Encoding: gzip

Однако CDN, призванная оптимизировать доставку, решила удалить этот заголовок и предоставлять контент, как если бы он был несжатым. Это нормально работало для браузеров, ожидающих необработанных файлов, таких как CSS или JavaScript, но когда пользователи пытались загрузить файлы, такие как CSV, PDF или ZIP-архивы, они получали поврежденные загрузки. Разархивирование таких файлов либо не удавалось сразу, либо давало данные, которые казались нечитаемыми или неполными.

Помимо двоичного повреждения, возникла еще более загадочная проблема: имена некоторых файлов были искажены странными символами, особенно при загрузке с помощью таких браузеров, как Chrome или Firefox. Это явление известно как моджибаке и возникает, когда программа интерпретирует последовательность байтов, используя непредусмотренную кодировку символов.

Путаница в кодировках символов

Моджибаке в именах загруженных файлов обычно возникает в следующих случаях:

  • Имя файла содержит символы, отличные от ASCII (например, буквы с диакритическими знаками или азиатские шрифты).
  • Браузер не знает, какой набор символов использовать.
  • В заголовках Content-Disposition или Content-Type отсутствуют правильные объявления кодировок.

Браузер, догадавшись, пытается интерпретировать имя файла, используя кодировку по умолчанию или резервную кодировку, например ISO-8859-1, что приводит к тарабарщине вместо разборчивых символов. Обычно это влияет на пользователей, загружающих файлы с именами на таких языках, как японский, русский или немецкий, где преобладают специальные символы.

Изначально разработчики задали соответствующие заголовки с сервера приложений, например:

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

Но, опять же, CDN изменил эти заголовки, удалив или заменив их, что привело к загрузкам без подсказки о кодировке. Это вызвало некорректное поведение браузера, поскольку имя файла интерпретировалось с неправильной кодировкой.

Исправление: принудительное использование кодировки в заголовках HTTP

После длительной отладки и отслеживания журналов разработчики подтвердили, что:

  • Файлы не были повреждены на исходном сервере.
  • Загрузки прошли успешно через Curl и прямой доступ по IP.
  • Проблема возникла только при обслуживании через CDN.

Таким образом, правильное решение было двояким:

  1. Заставьте CDN сохранять заголовки Content-Encoding , чтобы браузеры правильно получали и распаковывали содержимое GZIP.
  2. Установите явную charset как для Content-Type , так и для заголовков Content-Disposition , чтобы гарантировать правильное международное декодирование имени файла.

Окончательная рабочая конфигурация заголовка выглядела так:

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

Использование filename* с синтаксисом URL-кодировки UTF-8'' гарантирует, что браузеры интерпретируют имя файла в соответствии с RFC 5987. Это особенно поддерживается в современных браузерах, согласовывая межплатформенное поведение.

Почему CDN меняют заголовки

CDN часто направлены на оптимизацию производительности, уменьшение избыточности и стандартизацию ответов. С этой целью они могут:

  • Удалить или заменить директивы сжатия
  • Нормализовать типы контента
  • Удалите заголовки, которые не проходят фильтры безопасности или правила кэширования.

Однако эти оптимизации могут иметь неприятные последствия, если они тщательно переопределяют заданные параметры, критически важные для рендеринга контента или загрузки файлов. В этом инциденте неспособность CDN сохранить правильную Content-Encoding и charset оказалась пагубной как для удобства использования, так и для интернационализации.

Извлеченные уроки

Эта проблема служит ценным напоминанием для разработчиков, работающих в распределенных средах:

  • Всегда проверяйте доставку контента от начала до конца. Файлы, работающие на вашем сервере, могут вести себя по-разному в CDN.
  • Будьте явны в заголовках. Ничего не предполагайте о поведении по умолчанию — всегда указывайте тип контента, кодировку и кодировку.
  • Управляйте поведением CDN с помощью конфигурации. Большинство CDN допускают переопределения или правила для сохранения заголовков. Используйте их.
  • Проверьте поведение загрузки в нескольких браузерах и языковых стандартах. Ошибки интернационализации часто появляются только в этих условиях.

Часто задаваемые вопросы

Что такое моджибаке?

Моджибаке — это термин, используемый для описания искаженного или неправильного отображения символов, вызванного несоответствием кодировки символов. Это часто происходит, когда программное обеспечение неправильно интерпретирует кодировку символов, используемую для хранения или отправки текстовых данных.

Как gzip влияет на загрузку файлов?

При правильном использовании GZIP сжимает файлы, чтобы сократить время загрузки. Однако, если файл обслуживается как сжатый GZIP, но при этом отсутствует соответствующий заголовок Content-Encoding: gzip , браузеры могут не распаковать его, что приведет к повреждению или нечитаемости загрузок.

Зачем CDN удалять заголовки, такие как Content-Encoding или charset?

CDN отдают приоритет производительности и безопасности. При этом они часто нормализуют заголовки или применяют политики, удаляющие потенциально небезопасную или ненужную информацию. Это может непреднамеренно удалить важные метаданные, необходимые для правильной обработки контента.

Как правильно указать имена файлов, отличные от ASCII, для загрузки?

Используйте заголовок Content-Disposition с атрибутом filename* , используя кодировку UTF-8 и формат с экранированием процентов, как указано в RFC 5987. Например:

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

Как разработчики могут избежать подобных проблем в будущем?

Им следует проводить тесты на уровне CDN, явно указывать заголовки и использовать конфигурации CDN, которые сохраняют или передают все необходимые метаданные. Кроме того, на этапах отладки важно поддерживать документацию о том, как CDN изменяет трафик.