我的http
块定义了各种 gzip 规则。然后在我预压缩 gzip 文件的地方,我使用该gzip_static
模块。例如:
http {
gzip on;
#...
server {
#other vhost rules
location /assets/ {
gzip_static on;
}
}
}
对于不以 /assests 开头的 URL,nginx 会发送标头Content-Encoding: gzip
。但是,诸如这样的 URL/assets/css/style.css
肯定会返回压缩响应,但没有 Content-Encoding 标头。
这是预期的行为吗?应该如何配置 nginx?
答案1
对我来说,只打开 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
答案2
我遇到了一个location ~* \.(css|js|...) { expires 7d }
把事情搞乱了的块。我尝试了一下位置块,现在一切似乎都正常了。