关闭 Nginx 中某个位置的 gzip

关闭 Nginx 中某个位置的 gzip

如何关闭特定位置及其所有子目录的 gzip?我的主要站点在http://mydomain.com,我想关闭http://mydomain.com/foo和的 gzip http://mydomain.com/foo/bargzip在 中已打开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 gzipnginx.conf并尝试使用命名位置。但是 gzip 现在总是关闭,并且块gzip on;location /似乎无法重新打开 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;
    }

}

答案1

我认为您请求的 URL 正在try_files内部处理location ^~ /foo/,并且由于缺少这些文件,它们在内部被重定向到另一个locationgzip off继承的处理程序。

尝试在/foo位置中使用“命名位置”,然后@fooNoGzip使用gzip off内部和fascgi_pass内容定义该“命名”位置。

答案2

只是为了一些死灵浪漫:OP 的更新 nginx 配置不起作用,因为它最终由\.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;
    }
}

答案3

由于每个位置都是独立的,因此设置gzip offon@php_nogzip将不适用于location ~ \.php$,它仍使用 nginx/server 默认值。这就是您看到 gzip off 的原因,因为这是默认值。只有 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;
    }

相关内容