Comment envoyer un SVG compressé (dégonflé) via Apache2?
J'ai spécifié les attributs suivants dans le fichier .htaccess
de mon site:
AddOutputFilterByType DEFLATE image/svg+xml
DeflateCompressionLevel 9
Header append Vary Accept-Encoding
Cependant, mon actif SVG N'est pas envoyé sous forme compressée:
$ 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
J'ai vérifié que cet actif (asset.svg
) est envoyé avec le type MIME image/svg+xml
en utilisant Chrome, mais en utilisant les outils de développement Web, ce fichier spécifique n'est pas compressé lorsqu'il est envoyé au client.
L'ajout d'autres types MIME au fichier .htaccess
est réussi (par exemple, l'ajout de text/html
compresse les ressources HTML).
Cela semble spécifique à la façon dont les données SVG sont traitées. Que puis-je essayer ou résoudre pour que la compression SVG fonctionne?
5 réponses
Si Apache ne connaît pas le type mime du fichier (ICI image / svg + xml), vous devez le dire spécifiquement (pas nécessaire dans la plupart des Apaches):
AddType image/svg+xml svg svgz
Maintenant, quand Apache connaît le type de fichier, ajoutez simplement ceci pour le dégonfler:
AddOutputFilterByType DEFLATE image/svg+xml
Pour plus d'informations, voir https://httpd.apache.org/docs/2.4/mod/mod_deflate.html
Je soupçonne que cela est dû au signe plus dans le type MIME, qui peut nécessiter un échappement dans la directive AddOutputFilterByType. Vous pouvez également essayer d'utiliser la directive AddOutputFilter à la place, pour traiter tous les fichiers avec une certaine extension:
AddOutputFilter DEFLATE svg
La meilleure option que j'ai trouvée est de compresser tout sauf les images, que mod_deflate n'est pas capable de gérer.
Ajoutez les lignes suivantes au fichier 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
Si vous voulez voir la journalisation de ce qui a été compressé, ajoutez également ce qui suit:
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate
Essayez également d'ajouter le type. Certaines configurations semblent en avoir besoin pour diverses raisons. .svg fonctionne bien pour moi en utilisant le AddOutputFilterByType DEFLATE image/svg+xml
.
Essayez également d'ajouter le type mime.
AddType image/svg+xml svg
Lors d'une inspection dans error.log
de mon apache httpd
, il semble que nous ne devrions pas spécifier DeflateCompressionLevel
ici...
[Mon Feb 03 23:56:52 2014] [alert] [client 127.0.0.1] /var/www/.htaccess:DeflateCompressionLevel not allowed here
... J'ai donc supprimé le niveau de compression et mis seulement le
AddOutputFilterByType DEFLATE image/svg+xml
, ce qui le fait fonctionner correctement.
Exemples de sorties...
Avec dégonfler...
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�
Et sans dégonfler..
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>