Turn off gzip for a location in Nginx

22,903

Solution 1

I'd suppose that URLs you're requesting are being handled with try_files inside location ^~ /foo/ and due to absence of those files, they're internally re-directed to another location handler not having gzip off inherited.

Try using "named location" in /foo location, and then define that "named" location @fooNoGzip with gzip off inside and fascgi_pass stuff.

Solution 2

Just for the sake of some necro-romancy: the updated nginx configuration of the OP wasn't working because it's handled ultimately by \.php$ location block.

The proper solution would be removing it and making the named locations as the ones forwarding requests to FastCGI (PHP-FPM):

server {
    listen   80;
    server_name www.mydomain.com mydomain.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    root /var/www/mydomain/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ @php;
    }

    location /foo/ {
        try_files $uri $uri/ @php_nogzip;
    }

    location @php {
        gzip on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }

    location @php_nogzip {
        gzip off;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }
}
Share:
22,903

Related videos on Youtube

Nyxynyx
Author by

Nyxynyx

Hello :) These days its web development: PHP, Codeigniter, node.js, Javascript, jQuery, MySQL, mongoDB, HTML/CSS

Updated on September 18, 2022

Comments

  • Nyxynyx
    Nyxynyx over 1 year

    How can gzip be turned off for a particular location and all its sub-directories? My main site is at http://mydomain.com and I want to turn gzip off for both http://mydomain.com/foo and http://mydomain.com/foo/bar. gzip is turned on in nginx.conf.

    I tried turning off gzip as shown below, but the Response Headers in Chrome's dev tools shows that Content-Encoding:gzip.

    How should gzip/output buffering be disabled properly?

    Attempt:

    server {
        listen   80;
        server_name www.mydomain.com mydomain.com;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        root /var/www/mydomain/public;
    
        index index.php index.html;
    
        location / {
            gzip on;
            try_files $uri $uri/ /index.php?$args ;
        }
    
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_read_timeout 300;
        }
    
        location /foo/ {
            gzip off;
            try_files $uri $uri/ /index.php?$args ;
        }
    
    }
    

    UPDATE

    I turned off gzip in nginx.conf and tried using named locations. However gzip is now always off, and gzip on; in the location / block does not seem to turn gzip back on. Any ideas?

    server {
        listen   80;
        server_name www.mydomain.com mydomain.com;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        root /var/www/mydomain/public;
    
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ @php;
        }
    
        location /foo/ {
            try_files $uri $uri/ @php_nogzip;
        }
    
        location @php {
            gzip on;
            try_files $uri $uri/ /index.php?$args ;
        }
    
        location @php_nogzip {
            gzip off;
            try_files $uri $uri/ /index.php?$args ;
        }
    
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_read_timeout 300;
        }
    
    }
    
    • Admin
      Admin over 11 years
      Is your application compressing its response?
  • poige
    poige over 11 years
    @Nyxynyx, solved?
  • anup
    anup about 7 years
    This helped me. Turning off gzip was the right solution. However the down side is that it applied to all *.php. So, text/html for all php processed pages are not compressed. We do have CDN over Varnish which will cache pages for lower TTL and that does the Gzip at last mile.
  • Danila Vershinin
    Danila Vershinin almost 5 years
    This will never work. The gzip configuration directive only allows to be set in configuration directly and is not evaluated from a string variable produced by map.
  • higuita
    higuita almost 5 years
    @DanilaVershinin i never tested this, but if gzip do not accept variables and you need this, i would suggest open a bug in nginx, they are always adding support for more variable settings and this one looks like it would be useful for some people