2010-10-19 1 views
3

J'ai installé nginx avec gzip_static activé. Il fonctionne très bien pour les fichiers CSS et JavaScript, mais il semble aussi pour les versions gzip des fichiers d'image comme .png et .gif, bien que ceux-ci ne sont pas dans la liste des fichiers à compresser:Comment dire à gzip_static de ne pas chercher de fichiers image?

# strace -p 25044 2>&1 | grep gz 
open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 438 
open("/var/www/images/tools.png.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) 
open("/var/www/images/ads/bs.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) 
open("/var/www/images/gfxborder/border_right.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) 
open("/var/www/images/ads/hocuto03.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory) 

Voilà ma configuration nginx :

gzip on; 
gzip_disable  "msie6"; 
gzip_min_length 1000; 
gzip_types text/plain text/css application/x-javascript text/javascript; 
gzip_static on; 

Existe-t-il un moyen d'empêcher cela?

Répondre

5

J'ai trouvé une solution. En fait, deux solutions possibles:

  1. garder javascript et les fichiers CSS dans un répertoire distinct et créer la règle « emplacement » à utiliser gzip_static seulement pour que si cela est impossible répertoire

  2. (hébergement de plusieurs sites , pas tout sous votre contrôle, trop de répertoires et de fichiers) il existe une solution plus simple pour éviter plusieurs appels open() en utilisant open_file_cache_errors paramètre qui cache (ie se souvient) que le fichier .gz n'était pas présent et n'essaie pas de l'ouvrir à nouveau .

0

J'ai trouvé un moyen de modifier le code source de nginx, mais d'une manière très terrible:

  1. recherche de fichiers:

ngx_http_gzip_static_module.c (ver 1.0.1 , l'autre version peut être la même):

2 .in:

ngx_http_gzip_static_handler (ngx_http_request_t * r)

3 .found:

si (r-> uri.data [r-> uri.len - 1] == '/') { retour NGX_DECLINED ; }

  1. ajouter:

si (r-> uri.data [r-> uri.len - 1] == 'g' & & r-> uri.data [r- > uri.len - 2] == 'n' & & r-> uri.data [r-> uri.len - 3] == 'p' & & r-> uri.data [r-> uri.len - 4] == '.') { return NGX_DECLINED; } si (r-> uri.data [r-> uri.len - 1] == 'g' & & r-> uri.data [r-> uri.len - 2] == 'p' & & r-> uri.data [r-> uri.len - 3] == 'j' & & r-> uri.data [r-> uri.len - 4] == '.') { return NGX_DECLINED ; } si (r-> uri.data [r-> uri.len - 1] == 'o' & & r-> uri.data [r-> uri.len - 2] == 'c' & & r-> uri.data [r-> uri.len - 3] == 'i' & & r-> uri.data [r-> uri.len - 4] == '.') { return NGX_DECLINED; }

  1. Recompilez votre source.

C Quelqu'un sait peut le modifier pour être plus professtinal parce que je ne sais pas C :(

0

J'ai découvert un moyen simple de le faire en utilisant des blocs de localisation imbriqués:

location /assets { 
    root /usr/share/nginx/html; 
    location ~ .*.(js|css|html|png)+$ { 
     # Use for debugging 
     # add_header 'X-static-gzipping' 'on' always; 
     gzip_static on; 
    } 
    } 
Questions connexes