Настройка сервера говорит «сжатие включено», но HTML и основной JavaScript передаются без Content-Encoding. Причина может зависеть от типа ответа, размера, посредника или заголовка Accept-Encoding. Проверяйте реальные ответы нужных ресурсов, а не один переключатель хостинга.
Проверьте согласование кодирования для каждого ресурса
Сравнивайте каждый тип ресурса отдельно. Сжатие текстового HTML и JS отличается от попытки повторно сжать уже компактное изображение. Проверка должна учитывать согласование алгоритма клиентом и сервером и фактический переданный объём.
В HTTP клиент сообщает поддерживаемое кодирование через Accept-Encoding, а Content-Encoding описывает применённое к телу кодирование. Официальная документация.
Клиент сообщает допустимые алгоритмы, а сервер выбирает предусмотренное кодирование либо отдаёт несжатое тело. Поэтому один переключатель «gzip включён» не подтверждает состояние всех ресурсов. Возьмите документ HTML, CSS и основной JavaScript одного релиза. Для каждого сохраните запрос с Accept-Encoding и фактический ответ. Если CDN меняет кодирование, проверяйте публичный край отдельно от origin. Сравнение одного маленького CSS с большим JS недостаточно без учёта MIME и порога размера. Требуется понять правило, а затем подтвердить его на нужных типах.
Матрица MIME, размера и слоя инфраструктуры
Учебные сценарии в таблице задают ожидаемое поведение; фактические ответы своего сайта заносите отдельно.
| Сценарий | Отличие | Решение | Проверка |
|---|---|---|---|
| HTML | Текстовый документ | Проверить кодирование | Согласованный ответ |
| JavaScript | Текстовый bundle | Проверить MIME | Не исключён случайно |
| Маленький ответ | Порог размера | Проверить политику | Не ошибка по умолчанию |
| CDN и origin | Разные слои | Сравнить отдельно | Нет двойного кодирования |
В таблице запишите Content-Type, размер исходного ресурса, применённое кодирование и место, где оно должно происходить. Не пытайтесь сжать повторно уже компактный JPEG или другой формат без измерения пользы. Для маленьких текстовых ответов порог может быть осознанной настройкой. Добавьте ошибочный MIME, если bundle выдаётся как application/octet-stream и исключается из списка текстовых типов. Подтвердите, что это действительно тот файл, который получает страница, а не локальная копия сборки. Размер и тип публичного ответа могут отличаться от ожидаемого исходника.
Что измерять в Network и HTTP заголовках
Запросите HTML и JS с предусмотренным Accept-Encoding, сохраните Content-Type, Content-Encoding, Vary и размер передачи. Повторите через публичный CDN; origin и край могут иметь разные правила. Сравните с запросом без согласованного сжатия.
В браузере различайте размер переданных данных и размер разобранного ресурса. Сохраните Content-Encoding, Vary и заголовки запроса. Content-Length описывает конкретное передаваемое представление, когда такой заголовок есть; отсутствие не доказывает отсутствие сжатия. При curl учитывайте, просили ли вы автоматическую распаковку: сохранённый файл может оказаться уже декодированным. Не сравнивайте его размер с байтами сети как одну величину. Для полезного вывода покажите, какой алгоритм согласован, сколько передано и что клиент успешно обработал содержимое без повреждения.
Учебное различие CSS и JavaScript
Учебный сервер сжимает CSS, но не application/javascript. Сравнение одного CSS и одного JS показывает область правила. После добавления нужного типа проверьте публичный bundle и его распаковку, сохраняя исходную сборку.
Учебный сервер сжимает text/css, а JS выдаёт с типом, отсутствующим в конфигурации сжатия. Запросите оба с одинаковым поддерживаемым алгоритмом. После изменения нужного правила повторите тот же JS и убедитесь, что Content-Type остаётся правильным, Content-Encoding соответствует телу, а страница выполняет bundle. Дополнительно проверьте маленький текстовый ответ ниже принятого порога: он может оставаться несжатым намеренно. Опыт объясняет область конфигурации. Не меняйте всю сборку или минификацию одновременно, иначе станет трудно отделить влияние сетевого кодирования от изменения самого ресурса.
Исправьте типы и пороги на подтверждённом слое
Исправьте список MIME-типов, порог размера или обработку на соответствующем слое. Проверьте, что посредник не удаляет и не дублирует кодирование. Для кешируемых вариантов согласуйте ключ и заголовки ответа.
Если причина в MIME, исправьте выдачу типа или список поддерживаемых текстовых ответов. Если в пороге, оцените реальную экономию на нужных размерах. Если в посреднике, выясните, где тело распаковывается и заново кодируется. Не удаляйте Content-Encoding вручную, оставляя сжатые байты: клиент перестанет правильно понимать ответ. Аналогично нельзя добавить заголовок gzip к несжатому содержимому. В конфигурации должны согласованно меняться механизм кодирования и описание результата. После изменения проверьте ошибки загрузки и выполнение JavaScript, а не только снижение числа килобайт.
Кешированные варианты и двойное кодирование
Content-Length и размер распакованного тела могут описывать разные величины. Отсутствие сжатия у маленького ответа не обязательно является ошибкой; порог и экономию нужно оценивать по принятой конфигурации.
Убедитесь, что кеш различает согласованные варианты по предусмотренной политике. Заголовок Vary: Accept-Encoding часто участвует в этом механизме, но конкретные возможности CDN нужно сверять с его настройками. Несжатый клиент не должен получить закодированное тело, которое не умеет прочитать. Проверьте вариант с автоматическим декодированием и обычный запрос браузера. При двух слоях избегайте непреднамеренного двойного кодирования. Для статических заранее подготовленных файлов проверьте, что сервер выбирает соответствующий вариант и описывает его верно. Успешный origin-запрос не подтверждает поведение публичного кеша.
Приёмка передачи и корректного разбора тела
После релиза проверьте выбранные HTML, CSS и JS через публичный URL. Сохраните заголовки и фактические объёмы в согласованной методике. Страница должна разбираться и работать, несжатый контроль — получать корректное представление, маленькие ответы — следовать принятой политике порога. Разделите результат сжатия и общий вывод о скорости: уменьшение передачи не гарантирует ускорение всех этапов, особенно когда задержка находится в сервере или главном потоке. Приёмка подтверждает исправную передачу нужных ресурсов и отсутствие повреждения кешированных вариантов.
Критерии завершения проверки
Нужные текстовые ресурсы получают согласованное кодирование, клиент разбирает ответ без ошибки, переданный объём измерен корректно. Несжатый вариант и варианты кеша не возвращают повреждённое тело.
- HTML: Согласованный ответ. Зафиксируйте фактический результат и адрес проверенного сценария.
- JavaScript: Не исключён случайно. Зафиксируйте фактический результат и адрес проверенного сценария.
- Маленький ответ: Не ошибка по умолчанию. Зафиксируйте фактический результат и адрес проверенного сценария.
- CDN и origin: Нет двойного кодирования. Зафиксируйте фактический результат и адрес проверенного сценария.
Для смежных вопросов: Brotli сжатие: настройка для Nginx и Apache и Минификация CSS и JS: насколько это реально ускоряет сайт. Отдельные проверки сайта собраны на странице технического аудита reChecker.