Як вказати заголовок “Vary: Accept-Encoding” у .htaccess


81

Google PageSpeed ​​каже, що я повинен "вказати Vary: Заголовок кодування-прийняття" для JS та CSS. Як це зробити в .htaccess?


22
Не впевнений, чому це було закрито, лише тому, що він не включає мову програмування, не означає, що він не пов'язаний з кодуванням.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Я згоден, це було переглянуто понад 65100 разів, тому я думаю, що це досить пошукова тема, не кажучи вже про те, що я щодня відповідаю на питання htaccess.
Панама Джек,

Я знаю, що це як пекло, але заголовок Vary: Accept-Encodingповідомляє браузеру зберігати в кеші версію сторінки на основі Content-Encodingзаголовка. Ви повинні побачити stackoverflow.com/questions/1975416/… та developers.google.com/speed/docs/best-practices/…
Ісмаель Мігель

2
@IsmaelMiguel він фактично повідомить клієнту (і що важливіше, будь-яким серверам кешування на шляху), що файл відрізняється для кожного варіанту s значення заголовка запиту клієнта Accept-Encoding, а не для кожного Content-Encodingваріанту значення заголовка відповіді сервера.
aularon

@ BlueRaja-DannyPflughoeft Оскільки користувачі з великою репутацією та користувачі, які шукають репутацію, створюють собі репутацію, шукаючи питання, щоб закрити їх. Невдоволення тим, що це так часто призводить до закриття питань, яких не повинно бути.
Dan Nissenbaum,

Відповіді:


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-адреси через такі зміни.


Я не думаю, що це все. Мої JS та CSS вже стиснуті. PageSpeed ​​все ще скаржиться.
StackOverflowNewbie

3
Я думаю, що mod_deflate повинен надсилати заголовок Vary за замовчуванням.
Matthew Flaschen,

Я зробив те, про що ви згадали вище. Файли .js досі не стискаються.
Andy N

@Andy; можливо, на вашому сервері немає модуля "mod_deflate.c".
aularon

3
Apache 2.2 не вимагає розділу mod_headers у відповіді вище. mod_deflate вже робить те, що вам потрібно. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Арі Маніатіс,

4

Боюсь, Ауларон не запропонував достатньо кроків для завершення процесу. Трохи спроб і помилок, я зміг успішно увімкнути Gzipping на своєму виділеному сервері WHM.

Нижче наведені кроки:

  • Запустіть EasyApache у межах WHM, виберіть «Здути» у списку «Вичерпні параметри» та відновіть сервер.

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

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

Сподіваюся, це працює для всіх вас!

  • Метт

3

Щоб також зібрати файли шрифтів у стилі gzip!

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

Це зводило мене з розуму, але, схоже, після редагування Ауларона відсутня двокрапка "Vary". Тож перехід "Vary Accept-Encoding"на "Vary: Accept-Encoding"вирішену проблему для мене.

Я б прокоментував під постом, але, здається, це не дозволить.

У будь-якому випадку, я сподіваюся, це позбавляє когось тієї самої проблеми, що й у мене.


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 ...)
}

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 хостинг, необов'язково.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.