2017-06-28 3 views
1

In meinem Firefox oder Chrome, wenn ich den HTTP-Header überprüfe, ist das Ergebnis immer mit Content-Encoding: gzip. Aber ich habe Kunden berichten, dass sie stattdessen "Übertragung-Codierung: Chunked" sehen und die Anfrage nicht gezippt werden.CSS wird nicht immer gezippt warum?

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

Wenn ich oder der Kunde online eine gzip-Komprimierung tun überprüfen es bestätigt gzip ist aktiv.

https://checkgzipcompression.com = gzip!

Aber wenn ich einen Checker wie diesen verwende. http://onlinecurl.com/

ich auch die Transfer-Encoding erhalten:

Anfrage chunked:

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: ... 

Antwort:

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 

Warum werden einige Anfragen gzipped nicht, wenn es sollte, das ist mein Varnish config (der für gzip relevante Teil):

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"); 

Irgendwelche Ideen, danke.

Antwort

2

Antworten werden nur dann gezippt, wenn die Anfrage anzeigt, dass eine gezippte Antwort akzeptiert werden kann. Dies wird durch den Header Accept-Encoding in der Anfrage angezeigt. Vielleicht sendet Ihre Online curl diese Header nicht. Es kann für Ihre Kunden das gleiche sein, die dies sehen. Sie haben wirklich Kunden, die melden, dass sie Antworten nicht gezippt bekommen?

aktualisieren

Ah, ich sehe, was Sie jetzt tun. Verwenden Sie eine aktuelle Version von Varnish? Es ist nicht nötig, all das jetzt selbst zu tun. Lack behandelt alles nativ. Alles, was Sie tun müssen, ist do_gzip auf on für die Inhaltstypen, wo Sie es wollen, und Varnish kümmert sich um den Rest, einschließlich der Accept-Encoding Header. Siehe the documentation here.

So entfernen Sie alle Ihre gzip/Codierung Code mit Ausnahme des Teils direkt unter # Enabling GZIP bezogen werden: Arbeits

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

Und das wird wahrscheinlich bekommen alles. Es funktioniert auf diese Weise gut für mich. Die beste Menge VCL ist so wenig wie möglich, Varnish ist sehr gut im Umgang mit den Dingen. Vergessen Sie nicht, Varnish neu zu starten oder den Cache für diese Site nach der Änderung anderweitig zu löschen.

Im Fall ist es sinnvoll, verwende ich die folgende VCL hierfür:

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; 
} 

die für mehr Inhaltstypen überprüft, die von Kompression profitieren können, einschließlich HTML. Ich störe mich nicht mit application/x-javascript, wie es alt ist und nicht verwendet.

Auf einer anderen Anmerkung, sind Sie sicher, dass Sie die Vary Kopfzeile in der Weise ändern müssen, die Sie dort tun?

+0

Meine Anfrage enthält Accept-Encoding: gzip, deflate, aber die Antwort ist immer noch nicht gezippt und mit Transfer-Encoding: chunked – steffanjj

+0

Ich denke, es wäre am besten, alle Ihre VCL zu posten. – SuperDuperApps

+0

Der Beitrag wurde mit dem für gzip relevanten Teil aktualisiert. Lassen Sie mich wissen, wenn Sie die volle VCL benötigen. Vielen Dank. – steffanjj

Verwandte Themen