HTTP хедър – Vary

За какво се ползва HTTP хедърът Vary?

HTTP хедърът Vary (варира, видоизменя, вариация) се използва в HTTP отговора на сървъра за осведомяване на междинните (между уеб потребител и уеб сървър) кеширащи сървъри/услуги, че съдържанието на сайта варира спрямо точно определена характеристика на уеб потребителя. Тоест, да внимават кой вариант на съдържанието кешират и кой предоставят на различните уеб потребители.

За да знаят всички сървъри (услуги), които записват/кешират сайта и се намират между потребителя и сървъра източник, че има различни варианти на съдържанието, сървърът източник може да ги уведоми с хедъра Vary.

За стойност на хедъра Vary може да се зададе името на всеки HTTP хедър, който сайтът засича, за да определи кой вариант на съдържанието да предостави, например Vary: User-Agent, Accept-Encoding, Cookie

Vary: User-Agent

Възможно е сайтът да предоставя различен вариант на съдържанието за различните типове клиенти – мобилни и десктоп. Сайтът прави разлика между двата вида потребители, като използва информацията в HTTP заявката на клиента. И по-точно, в HTTP хедъра User-Agent, изпратен от клиента, се съдържа информацията която го описва – име и версия на уеб браузъра, операционна система на потребителя и други. В този случай сайтът предоставя подходящ вариант на съдържанието, базиран на данните от HTTP хедъра на клиента – User-Agent.

Към отговора на сървъра може да се добави HTTP хедърът: Vary: User-Agent

Когато уеб потребител се свързва директно със сървъра източник на съдържанието, според информацията в неговия HTTP хедър User-Agent се изпраща точния вариант на съдържанието.

Например ако уеб клиент изпрати към сайта хедъра:
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X)
то той ще бъде засечен като мобилен потребител и към него ще бъде изпратена точната мобилна версия на съдържанието;

ако хедърът е:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
към клиента ще бъде изпратена десктоп версия на съдържанието;

Точно тази разлика трябва да се има предвид от кеширащите услуги и обхождащите ботове, когато записват и индексират дадена страница. За да може след това на десктоп потребителя да предоставят десктоп версията, а на мобилния потребител да предоставят мобилната версия.

Ако хедърът Vary: User-Agent липсва в отговора на сървъра, може да се получат няколко ситуации:

Уеб кеш/прокси: Уеб кешът бива достъпен първо от десктоп потребител, търсещ дадена уеб страница. Кеширащият сървър изисква и получава съдържанието на тази страница от сървъра източник (не получава хедъра Vary: User-Agent). Уеб кешът препраща получения десктоп вариант на съдържанието на страницата и му прави копие. След това уеб кешът бива достъпен от мобилен потребител, търсещ същата уеб страница. Тъй като кеширащият сървър не знае, че трябва да провери HTTP хедъра User-Agent, той не вижда разлика между първия и втория потребител и за това предоставя вече записания при него десктоп вариант на страницата.

Търсачките и техните ботове: При обхождането на даден сайт ботовете на Google може да се представят като различни мобилни устройства и браузъри, с цел да достъпят и индексират отделно всеки вариант на сайта. Ако хедърът Vary: User-Agent не се изпрати към ботовете, те няма да знаят че освен индексираната дадена версия има още други. Индексирането на различните версии на съдържанието ще е от полза след това, когато дадената страница бъде потърсена. В зависимост от това дали потребителя е мобилен или десктоп, търсачката ще ги насочи към точния вариант на съдържанието.

Vary: Accept-Encoding

Друг пример за употребата на хедъра Vary е, когато сайтът предоставя компресирано съдържание. Ползва се за съвместимост с по-стари версии на браузърите или уеб клиенти, които не могат да обработват компресирано съдържание. Ако уеб клиентът не изпрати хедъра Accept-Encoding: gzip,br,deflate,sdch, тогава сървърът ще му изпрати некомпресирано съдържание.

В случай че сте активирали компресиране на статичното съдържание чрез опцията в cPanel » Настройки на компресиране, HTTP хедърcj Vary: Accept-Encoding е зададен автоматично и не е нужно да го задавате ръчно през .htaccess файла. Компресирането на статичното съдържание се управлява от модула на Apache – mod_deflate.

Когато даден уеб клиент поддържа обработката на компресирано съдържание, той ще обяви това пред сървъра с хедъра:

Accept-Encoding: gzip,br,deflate,sdch

Така сървърът ще знае, че клиентът поддържа компресирано съдържание, и ще му го изпрати, заедно с хедъра Content-Encoding: gzip, например.

Ако хедърът Vary: Accept-Encoding липсва в отговора на сървъра може да се получи следната ситуация:

Уеб кеш/прокси: Даден уеб клиент, поддържащ обработката на компресирано съдържание, достъпва сайта през уеб кеш/прокси, в отговор уеб кешът взима компресираното съдържание от сървъра източник и го изпраща към клиента. В кеша на уеб кеша/проксито се записва компресираният вариант на съдържанието. След това същият сайт е потърсен от уеб клиент, които не може да обработва компресирано съдържание и тъй като уеб кешът не знае, че трябва да провери за наличието на хедъра Accept-Encoding, то той му праща същото компресирано съдържание. По този начин уеб сайтът не се зарежда при този клиент.

Управление на HTTP хедър: Vary

HTTP хедърите (на HTTP заявката и HTTP отговора) могат да се настройват от модула към Apache – mod_headers, чрез задаване на параметри в .htaccess файла.

Apache модулът mod_headers е инсталиран и активиран по подразбиране на всички сървъри за хостинг при СуперХостинг.БГ.

Например при изпращане на файлове към клиента от типовете .js, .css, .xml и gz, да се изпраща и хедърът Vary: Accept-Encoding:

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

HTTP хедърите могат да се управляват и от приложенията в хостинг акаунта, например задаване на Vary хедър чрез PHP:

<?php
header("Vary: User-Agent");
?>

или в WordPress сайт (във файл functions.php):

function add_vary_header ($headers)
{
$headers['Vary'] = 'User-Agent';
Return $headers;
}
add_filter('wp_headers', 'add_vary_header');
Обновена: 12.10.2022

Беше ли Ви полезна тази статия?

Вижте още