Справочник

Сжатие gzip в .htaccess: mod_deflate на Apache

Сжатие gzip уменьшает страницы, стили и скрипты перед отправкой: браузер скачивает меньше и сам распаковывает ответ. В Apache сжатием занимается модуль mod_deflate, а какие файлы сжимать, задаёт строка AddOutputFilterByType в .htaccess.

≈ 6 мин чтения
Содержание 9

Что сделать прямо сейчас

  1. Перед правкой сохраните копию файла .htaccess к себе на компьютер: если что-то пойдёт не так, её можно будет вернуть.
  2. Проверьте, нет ли сжатия уже, — как проверить. Если в ответе есть строка Content-Encoding: gzip, ничего добавлять не нужно.
  3. Добавьте в .htaccess корневой папки блок со сжатием. Сохраните файл и сразу откройте сайт. Если появилась ошибка 500, уберите добавленные строки — сайт заработает как раньше.
  4. Проверьте снова: в ответе должна появиться строка 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 — блок

Источники

Сверено 15 октября 2026 года.

Что почитать дальше