Как указать заголовок «Vary: Accept-Encoding» в .htaccess

81

Google PageSpeed ​​говорит, что я должен «указать заголовок Vary: Accept-Encoding» для JS и CSS. Как мне это сделать в .htaccess?

StackOverflowNewbie
источник
22
Не уверен, почему это было закрыто, просто потому, что это не связано с языком программирования, не означает, что это не связано с кодированием.
BlueRaja - Дэнни Пфлугофт,
@ BlueRaja-DannyPflughoeft Я согласен, это было просмотрено более 65100 раз, поэтому я думаю, что это хорошо изученная тема, не говоря уже о том, что я каждый день отвечаю на вопросы о htaccess.
Панама Джек
Я знаю, что это держится, черт возьми, но заголовок Vary: Accept-Encodingскажет браузеру сохранить в кеше версию страницы на основе Content-Encodingзаголовка. Вы должны увидеть stackoverflow.com/questions/1975416/… и developers.google.com/speed/docs/best-practices/…
Ismael Miguel
2
@IsmaelMiguel он фактически сообщит клиенту (и, что более важно, любым кэширующим серверам в пути), что файл отличается для каждого варианта s значения заголовка запроса клиента Accept-Encoding`, а не для каждого Content-Encodingварианта значения заголовка ответа сервера.
aularon
@ BlueRaja-DannyPflughoeft Потому что пользователи с большой репутацией и пользователи, стремящиеся к репутации, создают репутацию, выслеживая вопросы, чтобы закрыть их. Обидно, что это так часто приводит к тому, что закрываются вопросы, которых не должно быть.
Дэн Ниссенбаум

Ответы:

89

Я предполагаю, что это означало, что вы включили сжатие gzip для файлов css и js, потому что это позволит клиенту получать как контент в кодировке gzip, так и простой контент.

Вот как это сделать в 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>

А вот как добавить Vary Accept-Encodingзаголовок: [src]

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

Vary:Заголовок сообщает , что содержание прослужило этот адрес будет меняться в зависимости от значения определенного заголовка запроса. Здесь говорится, что он будет обслуживать другой контент для клиентов, которые говорят, что они Accept-Encoding: gzip, deflate(заголовок запроса), чем контент, обслуживаемый клиентами, которые не отправляют этот заголовок. Основное преимущество этого, AFAIK, заключается в том, чтобы позволить промежуточным прокси-серверам кэширования знать, что им нужно иметь две разные версии одного и того же URL-адреса из-за такого изменения.

Aularon
источник
Я не думаю, что это все. Мои JS и CSS уже сжаты. PageSpeed ​​все еще жалуется.
StackOverflowNewbie
3
Я думаю, что mod_deflate по умолчанию должен отправлять заголовок Vary.
Мэтью Флашен,
Я сделал то, что вы упомянули выше. Файлы .js по-прежнему не сжимаются.
Andy N
@Энди; возможно, на вашем сервере нет модуля "mod_deflate.c".
aularon 01
3
Apache 2.2 не требует раздела mod_headers в ответе выше. mod_deflate уже делает то, что вам нужно. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ари Маниатис
4

Боюсь, что Aularon не предоставил достаточно шагов для завершения процесса. Путем проб и ошибок я смог успешно включить Gzipping на моем выделенном сервере WHM.

Ниже приведены шаги:

  • Запустите EasyApache в WHM, выберите Deflate в списке Exhaustive Options и перестройте сервер.

  • После этого перейдите к Конфигурация служб >> Конфигурация Apache >> Включить редактор >> Опубликовать VirtualHost Include, выберите Все версии, а затем вставьте код mod_headers.c и mod_headers.c (указанный выше в сообщении Aularon) поверх другого в пределах поле ввода.

  • После сохранения я наблюдал в среднем экономию данных 75,36%! Вы можете запустить тест до и после, используя этот инструмент HTTP-сжатия, чтобы увидеть свои собственные результаты: http://www.whatsmyip.org/http_compression/

Надеюсь, это сработает для всех вас!

  • Мэтт
Мэтт Д.
источник
3

Чтобы также заархивировать файлы шрифтов!

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

как в:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot
Том
источник
2

Много часов ушло на то, чтобы выяснить, что это было. Пожалуйста, прочтите этот пост, чтобы получить расширенные .HTACCESSкоды и узнать, что они делают.

Вы можете использовать:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"
Т. Тодуа
источник
1

Это сводило меня с ума, но похоже, что после редактирования aularon не хватало двоеточия "Vary". Итак, изменение, "Vary Accept-Encoding"чтобы "Vary: Accept-Encoding"решить проблему для меня.

Я бы прокомментировал под постом, но, похоже, это не позволит мне.

В любом случае, я надеюсь, что это избавит кого-то от тех же проблем, что и я.

user1473179
источник
2
Вы уверены, что это имеет значение? В документации 2.2 ни один из примеров не включает двоеточие: httpd.apache.org/docs/2.2/mod/mod_headers.html
Ник Коттрелл,
1

Если кому-то это нужно для NGINXфайла конфигурации, вот фрагмент:

location ~* \.(js|css|xml|gz)$ {
    add_header Vary "Accept-Encoding";
    (... other headers or rules ...)
}
user319730
источник
0

Нет необходимости указывать или даже проверять, сжат ли файл / сжался, вы можете отправить его в каждый файл по каждому запросу.

Он сообщает нижестоящим прокси, как сопоставлять заголовки будущих запросов, чтобы решить, можно ли использовать кешированный ответ, вместо того, чтобы запрашивать новый с исходного сервера.

<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>
  • при unsetжелании можно исправить некоторые ошибки в старом хостинге GoDaddy.

источник