За какво се ползва 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, тогава сървърът ще му изпрати некомпресирано съдържание.
Когато даден уеб клиент поддържа обработката на компресирано съдържание, той ще обяви това пред сървъра с хедъра:
Accept-Encoding: gzip,br,deflate,sdch
Така сървърът ще знае, че клиентът поддържа компресирано съдържание, и ще му го изпрати, заедно с хедъра Content-Encoding: gzip, например.
Ако хедърът Vary: Accept-Encoding липсва в отговора на сървъра може да се получи следната ситуация:
Уеб кеш/прокси: Даден уеб клиент, поддържащ обработката на компресирано съдържание, достъпва сайта през уеб кеш/прокси, в отговор уеб кешът взима компресираното съдържание от сървъра източник и го изпраща към клиента. В кеша на уеб кеша/проксито се записва компресираният вариант на съдържанието. След това същият сайт е потърсен от уеб клиент, които не може да обработва компресирано съдържание и тъй като уеб кешът не знае, че трябва да провери за наличието на хедъра Accept-Encoding, то той му праща същото компресирано съдържание. По този начин уеб сайтът не се зарежда при този клиент.
Управление на HTTP хедър: Vary
HTTP хедърите (на HTTP заявката и HTTP отговора) могат да се настройват от модула към Apache – mod_headers, чрез задаване на параметри в .htaccess файла.
Например при изпращане на файлове към клиента от типовете .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');