2017-06-28 21 views
1

在我的Firefox或Chrome瀏覽器中,如果檢查HTTP標頭,結果始終是Content-Encoding:gzip。但我有客戶報告他們看到「傳輸編碼:分塊」,而不是解壓縮請求。CSS並不總是被壓縮爲什麼?

http://www.example.com/public/css/style.min.css

如果我或者客戶做一個gzip壓縮在網上查詢它的證實gzip的活躍。

https://checkgzipcompression.com = gzip!

但是,如果我使用這樣的檢查。 http://onlinecurl.com/

我也得到傳輸編碼的:分塊

請求:

GET /style/css.css HTTP/1.1 
Host: www.example.com 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
User-Agent: ... 
Accept:/
Referer: http://www.example.com/ 
Accept-Encoding: gzip, deflate 
Accept-Language: ... 
Cookie: ... 

響應:

HTTP/1.1 200 OK 
Age: 532948 
cache-control: public, max-age=604800 
Content-Type: text/css 
Date: Wed, 28 Jun 2017 12:35:07 GMT 
ETag: "5349e8d595dfd21:0" 
Last-Modified: Wed, 07 Jun 2017 13:56:17 GMT 
Server: Microsoft-IIS/7.5 
Vary: X-UA,Accept-Encoding, User-Agent 
X-Cache: HIT 
X-Cache-Hits: 6327 
X-CacheReason: Static-js-css. 
X-Powered-By: ASP.NET 
X-Served-By: ip-xxx-xxx-xxx-xx.name.xxx 
x-stale: true 
X-UA-Device: pc 
X-Varnish: 993020034 905795837 
X-Varnish-beresp-grace: 43200.000 
X-Varnish-beresp-status: 200 
X-Varnish-beresp-ttl: 604800.000 
transfer-encoding: chunked 
Connection: keep-alive 

爲什麼有些要求不gzip壓縮,當它應該,這是我的Varnish配置(與gzip相關的部分):

if (req.http.Accept-Encoding) { 
    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|flv|swf)$") { 
    # No point in compressing these 
    remove req.http.Accept-Encoding; 
    } elsif (req.http.Accept-Encoding ~ "gzip") { 
    set req.http.Accept-Encoding = "gzip"; 
} elsif (req.http.Accept-Encoding ~ "deflate") { 
    set req.http.Accept-Encoding = "deflate"; 
    } else { 
    # unkown algorithm 
    remove req.http.Accept-Encoding; 
    } 
} 

# Enabling GZIP 
if (beresp.http.Content-Type ~ "(text/css|application/x-javascript|application/javascript)") { 
    set beresp.do_gzip = true; 
} 


if (beresp.http.Content-Encoding ~ "gzip") { 
    if (beresp.http.Content-Length == "0") { 
    unset beresp.http.Content-Encoding; 
    } 
} 

set beresp.http.Vary = regsub(beresp.http.Vary, "(?i)^(.*?)X-Forwarded-URI,?(.*)$", "\1\2"); 
set beresp.http.Vary = regsub(beresp.http.Vary, "(?i)^(.*?)User-Agent,?(.*)$", "\1\2"); 
set beresp.http.Vary = regsub(beresp.http.Vary, "^(.*?),?$", "X-UA,\1"); 
set beresp.http.Vary = regsub(beresp.http.Vary, "^(.*?),?$", "\1"); 

任何想法,謝謝。

回答

2

如果請求表明它可以接受gzip壓縮的響應,則只有gzip響應。這由請求中的Accept-Encoding標題指示。所以也許你的在線curl沒有發送這個頭文件。對於看到這個的客戶可能是一樣的。你真的有客戶報告他們沒有得到gzip響應?

更新

啊,我看你現在在做什麼。你使用最近版本的清漆嗎?現在不需要自己做所有這些。清漆在本地處理。您只需將do_gzip設置爲on即可獲取您想要的內容類型,然後Varnish負責其餘的部分,包括Accept-Encoding標題。請參閱the documentation here

所以只要刪除所有相關的代碼,除了部分您的gzip /編碼的直屬# Enabling GZIP

# Enabling GZIP 
if (beresp.http.Content-Type ~ "(text/css|application/x-javascript|application/javascript)") { 
    set beresp.do_gzip = true; 
} 

這可能會得到一切工作。這對我來說很好。 VCL的最佳用量越少越好,Varnish本身就擅長處理事物。不要忘記在更改後重新啓動Varnish或清除此網站的緩存。

在情況下,它是非常有用的,我用下面的VCL此:

if (
    beresp.status == 200 
    && beresp.http.content-type ~ "\b((text/(html|plain|css|javascript|xml|xsl))|(application/(javascript|xml|xhtml\+xml)))\b" 
) { 
    set beresp.do_gzip = true; 
} 

這對於可從壓縮獲益更多的內容類型,包括HTML檢查。我不打擾與application/x-javascript,因爲它是古老的,不使用。

另一個說明,你確定你需要修改Vary標題的方式,你在那裏做?

+0

我的請求包括接受編碼:gzip,deflate,但響應仍然沒有gzip和Transfer-Encoding:chunked – steffanjj

+0

我認爲最好是發佈所有的VCL。 – SuperDuperApps

+0

使用與gzip相關的部分更新了帖子。讓我知道你是否需要完整的VCL。謝謝。 – steffanjj