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

nginx gzip_static удаляет заголовок Content-Encoding

Мой http block определяет различные правила gzip. Затем, когда у меня есть предварительно скомпилированные файлы gzip, я использую gzip_static модуль. то есть что-то вроде:

http {
    gzip on;
    #...
    server {
        #other vhost rules
        location /assets/ {
            gzip_static on;
        }
    }
}

Для URL-адресов, которые не запускаются / не устанавливаются, nginx отправляет заголовок Content-Encoding: gzip. Однако URL-адреса, такие как /assets/css/style.css обязательно вернет скомпилированный ответ, но без заголовка Content-Encoding.

Это ожидаемое поведение? Как настроить nginx?

Просто включить его с помощью gzip_static для меня не сработало. Мне пришлось использовать gzip_proxied, прежде чем он начал работать.

location /as/ {
  gzip_static on;
  gzip_proxied    expired no-cache no-store private auth;

  gzip_min_length 500; # optional
  gzip_types      text/plain application/xml text/css; # optional

  add_header Z_LOCATION "gz static location block"; add_header URI $uri; # DEBUG info
}

Обратите внимание, что последняя строка добавляет еще два заголовка, которые помогают отладить. Вы можете увидеть это, используя отличный плагин для Firefox под названием «Live HTTP Headers», который я нашел очень полезным для отладки множества вещей, связанных с заголовками и кешированием. Обратите внимание, что «curl -I» не работает, поскольку он не отправляет заголовок, в котором говорится, что он принимает кодировку gzip.

Вы также должны убедиться, что файлы имеют одинаковую дату изменения.

touch style.css style.css.gz

Вот заголовки, которые я получаю, когда использую конфигурацию местоположения выше

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 06 Jan 2016 20:07:18 GMT
Content-Type: text/css
Last-Modified: Wed, 06 Jan 2016 19:55:15 GMT
Etag: "568d7123-84c"
Z_LOCATION: gz static location block
URI: /as/style.css
Via: 1.1 BC5-ACLD
Connection: Keep-Alive
Content-Encoding: gzip
Age: 0

У меня есть location ~* \.(css|js|...) { expires 7d } блок, который все испортил. Я поиграл с блоками локации, и теперь все вроде работает.