Как отправить сжатый (дефлированный) 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?
5 ответов
Если Apache не знает тип файла MIME (здесь image/svg+xml), вам нужно указать это конкретно (не требуется в большинстве Apache):
AddType image/svg+xml svg svgz
Теперь, когда Apache знает о типе файла, просто добавьте это, чтобы спустить его:
AddOutputFilterByType DEFLATE image/svg+xml
Для получения дополнительной информации см. https://httpd.apache.org/docs/2.4/mod/mod_deflate.html
Я подозреваю, что это происходит из-за знака плюс в MIME-типе, который может потребоваться экранировать в директиве AddOutputFilterByType. Вместо этого вы можете попробовать использовать директиву AddOutputFilter для обработки всех файлов с определенным расширением:
AddOutputFilter DEFLATE svg
Лучший вариант, который я нашел, - это сжать все, кроме изображений, которые 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
Попробуйте также добавить тип. Некоторые конфигурации, кажется, нуждаются в этом по разным причинам. .SVG отлично работает для меня, используя AddOutputFilterByType DEFLATE image/svg+xml
, Попробуйте также добавить тип MIME.
AddType image/svg+xml svg
На каком-то осмотре в error.log
моего апача 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
, что заставляет его работать правильно.
Пример выходов...
с дефлятом...
don@don-NE56R:/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�
и без спуска..
don@don-NE56R:/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>