So geben Sie den Header "Vary: Accept-Encoding" in .htaccess an

81

Google PageSpeed ​​sagt, ich sollte "einen Vary angeben: Accept-Encoding-Header" für JS und CSS. Wie mache ich das in .htaccess?

StackOverflowNewbie
quelle
22
Nicht sicher, warum dies geschlossen wurde, nur weil es keine Programmiersprache beinhaltet, heißt das nicht, dass es nicht mit Codierung zusammenhängt.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Ich stimme zu, dies wurde über 65100 Mal angesehen, daher denke ich, dass es ein gut gesuchtes Thema ist, ganz zu schweigen davon, dass ich jeden Tag htaccess-Fragen beantworte.
Panama Jack
Ich weiß, dass dies höllisch hält, aber der Header weist Vary: Accept-Encodingden Browser an, eine Version der Seite basierend auf dem Content-EncodingHeader im Cache zu speichern . Sie sollten stackoverflow.com/questions/1975416/… und developer.google.com/speed/docs/best-practices/… sehen
Ismael Miguel
2
@IsmaelMiguel teilt dem Client (und vor allem allen Caching-Servern auf dem Weg) mit, dass sich die Datei für jede Variante des s Anforderungsheaderwerts des Clients Accept-Encoding und nicht für jede Variante des Headerwerts Content-Encodingder Serverantwort unterscheidet.
Aularon
@ BlueRaja-DannyPflughoeft Weil Benutzer mit viel Ruf und Benutzer, die einen guten Ruf suchen, ihren Ruf aufbauen, indem sie nach Fragen suchen, um sie zu schließen. Frustrierend, dass es so oft dazu führt, dass Fragen geschlossen werden, die nicht sein sollten.
Dan Nissenbaum

Antworten:

89

Ich denke, es ist gemeint, dass Sie die GZIP-Komprimierung für Ihre CSS- und JS-Dateien aktivieren, da der Client dadurch sowohl GZIP-codierten Inhalt als auch einfachen Inhalt empfangen kann.

So geht's in apache2:

<IfModule mod_deflate.c>
    #The following line is enough for .js and .css
    AddOutputFilter DEFLATE js css

    #The following line also enables compression by file content type, for the following list of Content-Type:s
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml

    #The following lines are to avoid bugs with some browsers
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
</IfModule>

Und so fügen Sie den Vary Accept-EncodingHeader hinzu: [src]

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary: Accept-Encoding
  </FilesMatch>
</IfModule>

Der Vary:Header gibt an, dass der für diese URL bereitgestellte Inhalt je nach Wert eines bestimmten Anforderungsheaders variiert. Hier heißt es, dass für Clients, die dies angeben Accept-Encoding: gzip, deflate( anderer Anforderungsheader), andere Inhalte bereitgestellt werden als für Clients, die diesen Header nicht senden. Der Hauptvorteil von AFAIK besteht darin, dass zwischengeschaltete Caching-Proxys wissen, dass sie aufgrund einer solchen Änderung zwei verschiedene Versionen derselben URL benötigen.

Aularon
quelle
Ich denke nicht, dass es das ist. Mein JS und CSS sind bereits komprimiert. PageSpeed ​​beschwert sich immer noch.
StackOverflowNewbie
3
Ich denke, mod_deflate soll standardmäßig den Vary-Header senden.
Matthew Flaschen
Ich habe getan, was Sie oben erwähnt haben. Die .js-Dateien werden immer noch nicht komprimiert.
Andy N
@Andy; Möglicherweise verfügt Ihr Server nicht über das Modul "mod_deflate.c".
Aularon
3
Apache 2.2 benötigt den Abschnitt mod_headers in der obigen Antwort nicht. mod_deflate macht schon was du brauchst. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ari Maniatis
4

Ich fürchte, Aularon hat nicht genügend Schritte bereitgestellt, um den Vorgang abzuschließen. Mit ein wenig Versuch und Irrtum konnte ich Gzipping erfolgreich auf meinem dedizierten WHM-Server aktivieren.

Unten sind die Schritte:

  • Führen Sie EasyApache in WHM aus, wählen Sie in der Liste "Vollständige Optionen" die Option "Entleeren" und erstellen Sie den Server neu.

  • Wenn Sie fertig sind, gehen Sie zu Services Configuration >> Apache Configuration >> Include Editor >> Post VirtualHost Include, wählen Sie All Versions aus und fügen Sie den Code mod_headers.c und mod_headers.c (oben in Aularons Beitrag aufgeführt) über einem anderen in der Liste ein Eingabefeld.

  • Nach dem Speichern konnte ich durchschnittlich 75,36% Daten einsparen! Mit diesem HTTP-Komprimierungstool können Sie einen Test vor und nach dem Test ausführen, um Ihre eigenen Ergebnisse anzuzeigen : http://www.whatsmyip.org/http_compression/

Hoffe das funktioniert für euch alle!

  • Matt
Matt D.
quelle
3

Um auch Ihre Schriftdateien zu komprimieren!

add "x-font/otf x-font/ttf x-font/eot"

wie in:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot
Tom
quelle
2

Viele Stunden, um zu klären, was das war. Bitte lesen Sie diesen Beitrag , um die erweiterten .HTACCESSCodes zu erhalten und zu erfahren, was sie tun.

Sie können verwenden:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"
T.Todua
quelle
1

Das hat mich verrückt gemacht, aber es scheint, dass Aularons Bearbeitung den Doppelpunkt danach fehlte "Vary". Also geändert, "Vary Accept-Encoding"um "Vary: Accept-Encoding"das Problem für mich zu beheben.

Ich hätte unter dem Beitrag kommentiert, aber es scheint nicht so, als würde es mich lassen.

Wie auch immer, ich hoffe, das erspart jemandem die gleichen Probleme, die ich hatte.

user1473179
quelle
2
Sind Sie sicher, dass dies einen Unterschied macht? In den 2.2-Dokumenten enthält keines der Beispiele den Doppelpunkt: httpd.apache.org/docs/2.2/mod/mod_headers.html
Nic Cottrell
1

Wenn jemand dies für die NGINXKonfigurationsdatei benötigt, ist hier das Snippet:

location ~* \.(js|css|xml|gz)$ {
    add_header Vary "Accept-Encoding";
    (... other headers or rules ...)
}
user319730
quelle
0

Sie müssen nicht angeben oder überprüfen, ob die Datei komprimiert ist / ist, sondern können sie bei jeder Anforderung an jede Datei senden.

Es teilt nachgeschalteten Proxys mit, wie zukünftige Anforderungsheader abgeglichen werden sollen, um zu entscheiden, ob die zwischengespeicherte Antwort verwendet werden kann, anstatt eine neue vom Ursprungsserver anzufordern.

<ifModule mod_headers.c>
  Header unset Vary
  Header set Vary "Accept-Encoding, X-HTTP-Method-Override, X-Forwarded-For, Remote-Address, X-Real-IP, X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Server"
</ifModule>
  • das unsetist es, einige Fehler in älterem GoDaddy Hosting zu beheben, optional.

quelle