Как можно отключить 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;
}