Подтвердить что ты не робот

Как отправить сжатый (спущенный) SVG через Apache2?

Я указал следующие атрибуты на моем сайте .htaccess:

AddOutputFilterByType DEFLATE image/svg+xml
DeflateCompressionLevel 9
Header append Vary Accept-Encoding

Однако мой SVG-ресурс не отправляется в сжатой форме:

$ curl https://example.org/assets/svg/asset.svg --silent -H "Accept-Encoding: gzip,deflate" --write-out "${size_download}\n" --output /dev/null                 
152655                                                                                                                                                                                                                                  
$ curl https://example.org/assets/svg/asset.svg --silent --write-out "%{size_download}\n" --output /dev/null
152655

Я проверил, что этот актив (asset.svg) отправляется с типом MIME image/svg+xml с помощью Chrome, но с помощью инструментов веб-разработчика этот конкретный файл не сжимается при отправке клиенту.

Добавление других типов MIME в файл .htaccess успешно (например, добавление text/html сжимает атрибуты HTML).

Это похоже на то, как обрабатываются данные SVG. Что еще я могу попробовать или устранить, чтобы заставить работать сжатие SVG?

4b9b3361

Ответ 1

Если Apache не знает тип mime файла (здесь image/svg + xml), вам нужно указать его конкретно и добавить правило дефляции:

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

Эти две строки решают это для меня для другого типа файлов. Я просто изменил их на svg здесь (обратите внимание на . до svg)

Если вы не хотите использовать deflate, но gzip используйте следующее (здесь мы также добавляем svgz помимо svg)

AddType image/svg+xml svg svgz
AddEncoding gzip svgz

Ответ 2

Я подозреваю, что это связано с знаком плюса в типе MIME, который может потребоваться экранирование в директиве AddOutputFilterByType. Вы также можете попытаться использовать директиву AddOutputFilter, чтобы обрабатывать все файлы с определенным расширением:

AddOutputFilter DEFLATE svg

Ответ 3

Попробуйте добавить этот тип. Кажется, что некоторые конфигурации нуждаются в этом по разным причинам..svg отлично работает для меня, используя AddOutputFilterByType DEFLATE image/svg+xml. Попробуйте также добавить тип mime.

AddType image/svg+xml svg

Ответ 4

Лучший вариант, который я нашел, - это сжать все, кроме изображений, которые mod_deflate не может обработать.

добавить следующие строки в файл httpd.conf:

LoadModule deflate_module modules/mod_deflate.so

SetOutputFilter DEFLATE

BrowserMatch ^Mozilla/4 gzip-only-text/html

BrowserMatch ^Mozilla/4\.0[678] no-gzip

BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

SetEnvIfNoCase Request_URI \

\.(?:gif|jpe?g|png|exe)$ no-gzip dont-vary

Если вы хотите видеть, как было записано сжатое, добавьте также следующее:

DeflateFilterNote Input instream

DeflateFilterNote Output outstream

DeflateFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate

CustomLog logs/deflate_log deflate

Ответ 5

При некоторых проверках в error.log моего apache httpd, похоже, мы не должны указывать DeflateCompressionLevel здесь...

[Mon Feb 03 23:56:52 2014] [alert] [client 127.0.0.1] /var/www/.htaccess:DeflateCompressionLevel not allowed here

... Итак, я удалил уровень сжатия и поставил только AddOutputFilterByType DEFLATE image/svg+xml, что позволяет работать правильно.

Примеры выходов...

с дефлятом...

[email protected]:/var/www$ curl http://mydaddy.com:81/circle.svg -H "Accept-Encoding: gzip,deflate" --write-out "${size_download}\n"
ݶٮ;��uCL*j��z�9.�����#�_]#���̊Ve��p��$�y�D���h��þ ��|�XeP��R�

и без дефляции.

[email protected]:/var/www$ curl http://mydaddy.com:81/circle.svg  --write-out "${size_download}\n"
<svg height="100" width="100">
  <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
  Sorry, your browser does not support inline SVG.  
</svg>