Я использую 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?