Назад | Перейти на главную страницу

Обслуживание SVG как GZIP не кэширует его в последующих запросах

Я использую GZIP для всех файлов SVG. Он хорошо работает со следующим оператором в файле конфигурации (не .htaccess)

AddType image/svg+xml .svg
AddOutputFilterByType DEFLATE image/svg+xml

Однако, нажав F5, браузер запросит файл на сервере, вернув 200 Код состояния вместо возврата ожидаемого 304 Код состояния.

Если я удалю AddOutputFilterByType затем сервер возвращается 304 но содержимое не хранится в архиве GZIP.

Вот несколько необработанных заголовков запросов

НЕТ GZIP (код состояния 200)

Accept-Ranges: bytes
Cache-Control: max-age=2592000
Connection: Keep-Alive
Content-Length: 689
Content-Type: image/svg+xml
Date: Thu, 02 Jul 2015 10:41:09 GMT
Etag: "2b1-5157f331b2480"
Expires: Sat, 01 Aug 2015 10:41:09 GMT
Keep-Alive: timeout=5, max=80
Last-Modified: Thu, 07 May 2015 15:02:26 GMT
Server: Apache

НЕТ GZIP (код состояния 304)

Cache-Control: max-age=2592000
Connection: Keep-Alive
Date: Thu, 02 Jul 2015 10:39:12 GMT
Etag: "2b1-5157f331b2480"
Expires: Sat, 01 Aug 2015 10:39:12 GMT
Keep-Alive: timeout=5, max=71
Server: Apache

С GZIP

Accept-Ranges: bytes
Cache-Control: max-age=2592000
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 451
Content-Type: image/svg+xml
Date: Thu, 02 Jul 2015 10:38:45 GMT
Etag: "2b1-5157f331b2480-gzip"
Expires: Sat, 01 Aug 2015 10:38:45 GMT
Keep-Alive: timeout=5, max=75
Last-Modified: Thu, 07 May 2015 15:02:26 GMT
Server: Apache
Vary: Accept-Encoding

Спасибо!

Это ошибка в Apache, из-за которой он не обрабатывает Etags должным образом для сжатого содержимого. Можно решить, отключив gzip (как вы заметили, но это влечет за собой снижение производительности) или отключив ETags (и в зависимости от заголовка Last-Modified для 304 секунд - так что никаких реальных потерь). Я предпочитаю отключать ETags.

Есть также альтернативный вариант (DeflateAlterETag), но только в Apache 2.5, и даже он мне кажется выдумкой.

Подробнее здесь: Почему Apache отправляет 200 OK, в то время как Last-modified соответствует If-modified-Since?