Сжатие gzip в .htaccess: mod_deflate на Apache
Сжатие gzip уменьшает страницы, стили и скрипты перед отправкой: браузер скачивает меньше и сам распаковывает ответ. В Apache сжатием занимается модуль mod_deflate, а какие файлы сжимать, задаёт строка AddOutputFilterByType в .htaccess.
Содержание 9
Что сделать прямо сейчас
- Перед правкой сохраните копию файла .htaccess к себе на компьютер: если что-то пойдёт не так, её можно будет вернуть.
- Проверьте, нет ли сжатия уже, — как проверить. Если в ответе есть строка Content-Encoding: gzip, ничего добавлять не нужно.
- Добавьте в .htaccess корневой папки блок со сжатием. Сохраните файл и сразу откройте сайт. Если появилась ошибка 500, уберите добавленные строки — сайт заработает как раньше.
- Проверьте снова: в ответе должна появиться строка Content-Encoding: gzip.
Блок со сжатием
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE text/javascript application/javascript
AddOutputFilterByType DEFLATE application/xml application/rss+xml
AddOutputFilterByType DEFLATE application/json image/svg+xml
</IfModule>
</IfModule>Строка AddOutputFilterByType относится к модулю mod_filter, поэтому блоков IfModule два: если какого-то модуля нет, Apache пропустит строки, и ошибки 500 не будет.
В списке — страницы, простой текст, стили, скрипты, XML, RSS, JSON и картинки SVG: SVG — тоже текст. Тип своего файла можно узнать через curl — как.
Страницы, которые собирает PHP, тоже сжимаются: модуль сжимает ответ уже после того, как его подготовил скрипт.
Что не сжимать
- Картинки JPEG, PNG и WebP в список не входят: эти форматы уже сжаты, и в примере из документации Apache картинки тоже не сжимают.
- Не пишите в .htaccess строку
Header set Content-Encoding gzip: она только помечает ответ как сжатый, а сам ответ не меняет. Браузер не сможет его распаковать и покажет ошибку ERR_CONTENT_DECODING_FAILED. - Строку Vary: Accept-Encoding добавлять не нужно — mod_deflate ставит её сам.
Как проверить
В терминале компьютера (как открыть терминал, про curl) запросите главную страницу и попросите сжатие, как это делает браузер:
curl -sI -H "Accept-Encoding: gzip" https://example.com/В ответе должна быть строка Content-Encoding: gzip — curl может показать её маленькими буквами. Без части -H "Accept-Encoding: gzip" curl сжатия не просит, и сервер ответит без него — так и должно быть.
Так же проверьте файл стилей — адрес возьмите из кода страницы, как его найти:
curl -sI -H "Accept-Encoding: gzip" https://example.com/css/style.cssНа хостинге
На хостинге сжатие может быть включено заранее — тогда первая проверка сразу покажет Content-Encoding: gzip, и ничего добавлять не нужно. Если сжатия нет, вставьте блок в .htaccess корневой папки через файловый менеджер в панели — где лежит файл.
В справке Beget о подключении SSL, в части про переадресацию на HTTPS, сказано, что правила из .htaccess работают только для динамических данных. Если страницы сжимаются, а стили и скрипты нет, спросите поддержку хостинга, как включить сжатие для них.
На своём VPS
В Ubuntu модули deflate и filter включаются при установке Apache, и в файле настроек модуля уже есть список: HTML, простой текст, XML, CSS, JavaScript, RSS и WebAssembly. JSON и SVG в нём нет — чтобы сжимать и их, вставьте в .htaccess блок со сжатием целиком.
Строке AddOutputFilterByType в .htaccess нужна группа FileInfo — проще всего разрешить AllowOverride All: как разрешить .htaccess.
Если модуль выключали, включите его снова. Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
sudo a2enmod deflateЗатем проверьте настройки: sudo apache2ctl configtest — в конце ответа должно быть Syntax OK — и примените их: sudo systemctl restart apache2.
Если сайт работает на nginx, сжатие включается строкой gzip — сжатие gzip в nginx.
Ошибки и как их исправить
| Что видите | Что делать |
|---|---|
| в ответе нет Content-Encoding | проверьте, что в команде есть -H "Accept-Encoding: gzip". Если есть — модуль выключен или тип файла не в списке: сверьте тип |
| ошибка ERR_CONTENT_DECODING_FAILED | уберите строку Header set Content-Encoding — разбор ошибки |
| ошибка 500 после сохранения | опечатка, незакрытый блок или на VPS не разрешена группа FileInfo — разбор |
| страницы сжаты, а стили и скрипты нет | проверьте их тип через curl и есть ли он в списке; на хостинге спросите поддержку — см. выше |
| ответы JSON не сжимаются | добавьте в список тип application/json — блок |
Источники
- Документация Apache: mod_deflate — пример со строкой AddOutputFilterByType DEFLATE для текстовых типов; картинки в примере не сжимают; модуль сам добавляет Vary: Accept-Encoding; сжатие идёт после фильтров вроде PHP.
- Документация Apache: AddOutputFilterByType — строка из модуля mod_filter; в .htaccess нужна группа FileInfo.
- Исходный код Apache 2.4.58: mod_deflate.c — сжимает, только если в запросе есть Accept-Encoding с gzip; ставит Content-Encoding: gzip и Vary, в том числе в ответе на запрос HEAD.
- Файл deflate.conf из пакета apache2 в Ubuntu 24.04 — какие типы сжимаются сразу после установки: HTML, текст, XML, CSS, JavaScript, RSS и WebAssembly; JSON и SVG в списке нет.
- Сценарий установки из пакета apache2 в Ubuntu 24.04 — модули deflate и filter включаются при установке Apache.
- Документация Apache: IfModule — строки внутри блока выполняются, только если модуль загружен, иначе Apache их пропускает; блок можно писать в .htaccess.
- Beget: SSL-сертификат на сайт — в части про переадресацию на HTTPS: правила из .htaccess работают только для динамических данных.
Сверено 15 октября 2026 года.
Что почитать дальше
- Сжатие gzip в nginxто же для сайта на nginx.
- ERR_CONTENT_DECODING_FAILEDесли браузер не может распаковать ответ.
- Кэш браузера в .htaccessвторой способ ускорить сайт.
- Файл .htaccessчто это, как создать и не сломать сайт.