Назад | Перейти на главную страницу

Отключите gzip для местоположения в Nginx

Как можно отключить gzip для определенного места и всех его подкаталогов? Мой основной сайт находится по адресу http://mydomain.com и я хочу отключить gzip для обоих http://mydomain.com/foo и http://mydomain.com/foo/bar. gzip включен в nginx.conf.

Я пробовал выключить gzip как показано ниже, но заголовки ответов в инструментах разработчика Chrome показывают, что Content-Encoding:gzip.

Как правильно отключить gzip / буферизацию вывода?

Попытка:

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 ;
    }

}

ОБНОВИТЬ

Я выключил gzip в nginx.conf и попытался использовать именованные местоположения. Однако теперь gzip всегда отключен, и gzip on; в location / block, похоже, не включает gzip. Любые идеи?

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;
    }

}

Я полагаю, что запрашиваемые вами URL-адреса обрабатываются try_files внутри location ^~ /foo/ и из-за отсутствия этих файлов они внутренне перенаправляются на другой location обработчик, не имеющий gzip off унаследовано.

Попробуйте использовать "именованное местоположение" в /foo местоположение, а затем определите это "именованное" местоположение @fooNoGzip с участием gzip off внутри и fascgi_pass прочее.

Просто ради некоторой некро-романтики: обновленная конфигурация nginx OP не работала, потому что в конечном итоге она обрабатывалась \.php$ блок местоположения.

Правильным решением было бы удалить его и сделать названные местоположения теми, которые перенаправляют запросы в 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;
    }
}

Поскольку каждое местоположение является независимым, настройка gzip off на @php_nogzip не будет применяться к location ~ \.php$, он по-прежнему использует значение по умолчанию для nginx / server. Вот почему вы видите, что gzip отключен, потому что это значение по умолчанию. Только файлы, доставленные try_files в @php_nogzip будет сжат.

Единственный способ, который я вижу, - это использовать карту. В блоке http используйте:

map $uri   $gz {
   default  "on";
    ~/foo/  "off";
}

Затем на сервере:

   location ~ \.php$ {
        gzip $gz; 
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }