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?

33
demandé sur aularon 2014-01-26 02:01:55

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

65
répondu Reeno 2018-01-24 19:28:57

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
3
répondu rmeakins 2014-01-29 02:55:48

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
2
répondu Fabio Albertoni 2017-04-13 19:23:44

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
1
répondu Panama Jack 2014-01-29 03:56:25

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>
0
répondu Siva Tumma 2014-02-03 18:33:06