Jak określić nagłówek „Vary: Accept-Encoding” w .htaccess

81

Google PageSpeed ​​mówi, że powinienem „Specify a Vary: Accept-Encoding header” dla JS i CSS. Jak to zrobić w .htaccess?

StackOverflowNewbie
źródło
22
Nie wiem, dlaczego zostało to zamknięte, tylko dlatego, że nie obejmuje języka programowania, nie oznacza, że ​​nie jest związane z kodowaniem.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Zgadzam się, obejrzano to ponad 65100 razy, więc myślę, że jest to dobrze wyszukiwany temat, nie wspominając o tym, że codziennie odpowiadam na pytania htaccess.
Panama Jack,
Wiem, że to diabli, ale nagłówek Vary: Accept-Encodingpowie przeglądarce, aby zapisała w pamięci podręcznej wersję strony opartą na Content-Encodingnagłówku. Powinieneś zobaczyć stackoverflow.com/questions/1975416/… and developers.google.com/speed/docs/best-practices/…
Ismael Miguel
2
@IsmaelMiguel to faktycznie powie klientowi (i co ważniejsze, wszystkim serwerom buforującym po drodze), że plik różni się dla każdego wariantu s wartości nagłówka żądania Accept-Encoding`, a nie dla każdego Content-Encodingwariantu wartości nagłówka odpowiedzi serwera.
aularon
@ BlueRaja-DannyPflughoeft Ponieważ użytkownicy o dużej reputacji i użytkownicy poszukujący reputacji budują reputację, szukając pytań do zamknięcia. Frustrujące, że tak często prowadzi do zamykania pytań, które nie powinny.
Dan Nissenbaum

Odpowiedzi:

89

Myślę, że oznacza to włączenie kompresji gzip dla plików css i js, ponieważ umożliwi to klientowi odbieranie zarówno treści zakodowanej w gzip, jak i zwykłej zawartości.

Oto jak to zrobić w 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>

A oto jak dodać Vary Accept-Encodingnagłówek: [src]

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

Vary:Nagłówek mówi, że zawartość służył za tym adresem będą się różnić w zależności od wartości określonej nagłówku żądania. Tutaj jest napisane, że będzie obsługiwać inną treść dla klientów, którzy tak twierdzą Accept-Encoding: gzip, deflate(nagłówek żądania), niż treść serwowaną klientom, którzy nie wysyłają tego nagłówka. Główną zaletą tego rozwiązania, AFAIK, jest poinformowanie pośrednich proxy buforujących, że muszą mieć dwie różne wersje tego samego adresu URL z powodu takiej zmiany.

aularon
źródło
Nie sądzę, żeby to było to. Moje JS i CSS są już skompresowane. PageSpeed ​​wciąż narzeka.
StackOverflowNewbie
3
Myślę, że mod_deflate ma domyślnie wysyłać nagłówek Vary.
Matthew Flaschen
Zrobiłem to, o czym wspomniałeś powyżej. Pliki .js nadal nie są kompresowane.
Andy N
@Andy; być może twój serwer nie ma modułu "mod_deflate.c".
aularon
3
Apache 2.2 nie wymaga sekcji mod_headers w powyższej odpowiedzi. mod_deflate już robi to, czego potrzebujesz. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ari Maniatis
4

Obawiam się, że Aularon nie podał wystarczającej liczby kroków, aby zakończyć proces. Dzięki niewielkiej liczbie prób i błędów udało mi się z powodzeniem włączyć Gzipping na moim dedykowanym serwerze WHM.

Poniżej znajdują się kroki:

  • Uruchom EasyApache w WHM, wybierz opcję Deflate na liście Exhaustive Options i odbuduj serwer.

  • Po zakończeniu przejdź do konfiguracji usług >> Konfiguracja Apache >> Dołącz edytor >> Opublikuj VirtualHost Include, wybierz All Versions, a następnie wklej kod mod_headers.c i mod_headers.c (wymieniony powyżej w poście Aularona) na drugim w pole wejściowe.

  • Po zapisaniu widziałem średnio 75,36% oszczędności danych! Możesz uruchomić test przed i po, używając tego narzędzia kompresji HTTP, aby zobaczyć własne wyniki: http://www.whatsmyip.org/http_compression/

Mam nadzieję, że to działa dla was wszystkich!

  • Matt
Matt D.
źródło
3

Aby zgzować również pliki czcionek!

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

jak w:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot
Tomek
źródło
2

Wiele godzin spędzonych na wyjaśnieniu, co to takiego. Przeczytaj ten post, aby uzyskać zaawansowane .HTACCESSkody i dowiedzieć się, do czego służą.

Możesz użyć:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"
T.Todua
źródło
1

Doprowadzało mnie to do szału, ale wygląda na to, że po edycji aularona brakowało okrężnicy "Vary". Więc zmiana, "Vary Accept-Encoding"aby "Vary: Accept-Encoding"rozwiązać problem za mnie.

Komentowałbym pod postem, ale nie wygląda na to, żebym na to pozwolił.

W każdym razie, mam nadzieję, że to zaoszczędzi komuś tych samych kłopotów, co ja.

user1473179
źródło
2
Czy na pewno to robi różnicę? W dokumentach 2.2 żaden z przykładów nie zawiera dwukropka: httpd.apache.org/docs/2.2/mod/mod_headers.html
Nic Cottrell,
1

jeśli ktoś potrzebuje tego do NGINXpliku konfiguracyjnego, oto fragment:

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

Nie ma potrzeby określania lub nawet sprawdzania, czy plik jest / jest skompresowany, możesz wysłać go do każdego pliku, Na każde żądanie.

Informuje podrzędne serwery proxy, jak dopasować przyszłe nagłówki żądań, aby zdecydować, czy można użyć buforowanej odpowiedzi, zamiast żądać nowej odpowiedzi z serwera pochodzenia.

<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>
  • unsetto naprawić kilka błędów w starszych GoDaddy hosting, opcjonalnie.

źródło