3 votes

Comment éviter le gzip sur les images redimensionnées en php ?

Nous ne devrions pas gzip les images, non ? Comment éviter de compresser des images comme celle-ci ? img/sample.php?id=image_name.jpg peut aussi être appelé comme ceci img/sample.php?id=image_name.jpg&size=3 les images actuelles se trouvent ici /images/items/

J'ai essayé d'utiliser 2 types de configuration pour gzip dans httpd.conf (voir ci-dessous), mais dans les deux cas, les images ont été gzippées de toute façon.

Les images ne sont manifestement pas traitées comme un fichier .jpg ordinaire, car si c'était le cas, elles n'auraient pas été compressées avec l'une des configurations ci-dessous. Cependant, les en-têtes en direct le montrent comme une image/jpeg normale.

Une idée de la façon de réparer cela ?

1er essai :

<Location />
# Insert filter
SetOutputFilter DEFLATE

# Netscape 4.x has some problems...
<Location />
# Insert filter
SetOutputFilter DEFLATE

# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>

2ème essai :

    <IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain    
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE text/xml    
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
</IfModule>

4voto

Brad Points 3206

Cette partie :

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

recherche les extensions de fichier image dans le URI de la demande . Les extensions de vos fichiers sont dans le chaîne de requête .

Leider, mod_setenvif n'a pas accès à la chaîne de requête et, si je lis correctement la documentation, il en va de même pour LocationMatch .

mod_rewrite Cependant, il a accès à la chaîne de requête et peut définir des variables d'environnement.

RewriteCond %{QUERY_STRING} \.(?:gif|jpe?g|png)$
RewriteRule ^ - [E=no-gzip,dont-vary] 

Si vous utilisez mod_rewrite de toute façon, il serait peut-être plus judicieux de l'utiliser pour réécrire les URL de manière à ce qu'elles ne comportent pas de chaîne de requête. Ce qui suit rend les deux lignes précédentes inutiles.

RewriteRule /generated_images/(.*\.(?:gif|jpe?g|png))$ /sample.php?id=$1

0 votes

Merci @Ladadadada pour les instructions détaillées et les éclaircissements ! votre dernière ligne de code redirigera-t-elle les images php vers la nouvelle url ? ou devrai-je l'appeler depuis l'emplacement statique ? et "generated_images" est un exemple seulement, n'est-ce pas ?

0 votes

Il n'y a pas de redirection ici, seulement une réécriture. Cela signifie que l'URL restera telle que le navigateur l'a demandée à l'origine. Vous pouvez en faire une redirection en utilisant [R] à la fin. Oui, generated_images est un exemple. Vous pouvez l'appeler comme vous voulez.

0 votes

J'ai fait ce que vous avez dit pour réécrire l'uri de l'image de la requête, mais elle est toujours affichée comme étant gzippée :( voir whatsmyip.org/http-compression-test/ par rapport au fichier image normal qui n'est pas compressé. whatsmyip.org/http-compression-test/ (cela a été fait en php, est-ce le problème ? cela pourrait être fait en apache ?)

1voto

pQd Points 29251

Essayez d'inclure ceci :

<LocationMatch \.jpg$>
  SetOutputFilter none
</LocationMatch>

0 votes

Merci @pQd, est-ce que cela peut être utilisé avec mes deux codes ? Est-ce que l'endroit où je l'ajoute est important, en dessous ou au-dessus du code deflate ?

0 votes

Vérifiez-le simplement de manière empirique.

0 votes

Désolé pour la question idiote comment faire avec un répertoire entier <LocationMatch dir_name/$> ?

-1voto

John Doe Points 11

Je l'utilise dans le fichier .htaccess, ce qui est assez simple :

<FilesMatch "\.(gif|jpg|png|zip|7z|rar|mp3|avi|swf)$">
    SetEnv no-gzip 1
    SetEnv dont-vary 1
</FilesMatch>

Et pour les fichiers images envoyés avec scripts et une querystring, on ajoute ceci :

RewriteEngine on

RewriteCond %{QUERY_STRING} gif|jpg|png [NC]

RewriteRule ^ - [E=no-gzip,dont-vary]

Remarque : Ces extensions sont sensibles à la casse, donc si le fichier s'appelait IMAGE.JPG, le serveur interviendrait quand même et les gzipera. Ajoutez les extensions en majuscules si vous en avez besoin. Je n'ai pas utilisé le '$' car vous avez ajouté une variable de taille à votre chaîne de recherche et vous avez donc besoin d'une recherche par sous-chaîne, et non par fin de chaîne.

De plus, il serait préférable de choisir un nom unique pour le script qui gère les fichiers image comme "image.php" ou d'utiliser une variable unique dans la chaîne de requête pour piéger et ne pas se soucier de chaque extension d'image.

Par exemple RewriteCond %{QUERY_STRING} op=download_image [NC]

RewriteRule ^ - [E=no-gzip,dont-vary]

Pour le cas de disons /sample.php?op=download_image&id=image_name.jpg&size=3

Trapper "image.php" serait plus court bien sûr avec la chaîne de requête, mais de toute façon.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X