如何关闭特定位置及其所有子目录的 gzip?我的主要站点在http://mydomain.com
,我想关闭http://mydomain.com/foo
和的 gzip 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 gzip
,nginx.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/
,并且由于缺少这些文件,它们在内部被重定向到另一个location
未gzip 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 off
on@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;
}