Як вказати заголовок “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.