26 января 2016      620      0

Http заголовки в запросах к серверу

Все статьи из цикла:

Продолжим изучение http заголовков. В этой статье мы рассмотрим самые распространённые заголовки запросов.

Заголовок Host

Браузер посылает HTTP запрос на конкретные IP адреса. Но так как на одном сервере не редко размещается несколько сайтов, сервера должны понимать, какой именно сайт нужен браузеру. Поэтому отправляется заголовок host.

Host: www.borpost.ru

В php значение заголовка хранится в переменной $_SERVER[‘HTTP_HOST’], которая часто совпадает с $_SERVER[‘SERVER_NAME’]. Разница в них в том, что в первой информация берётся из самого заголовка, а во второй из настроек сервера. Ну а так как при установке сервера заголовок сравнивается с той настройкой, эти переменные почти не отличаются. Почему «почти»? Потому что в одной, например, может быть указан только домен, а в другой www.домен.

User-Agent
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

Этот заголовок несёт в себе несколько видов информации:

  • Название браузера и его версию.
  • Название операционной системы и её версию.
  • Язык системы по умолчанию.

С помощью этих заголовков сайты собирают информацию о своих посетителях. Например, они могут определять всех пользователей, пользующихся мобильными браузерами, и перенаправлять их на версию сайта для мобильных телефонов.

В php значение User-Agent хранится в переменной $_SERVER[‘HTTP_USER_AGENT’].

if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {  
	echo "Пожалуйста, прекратите использовать IE6!";  
}
Accept-Language
Accept-Language: ru,en-us;q=0.7,en;q=0.3

Этот заголовок показывает, какой язык выбран пользователем языком по умолчанию. Если сайт имеет несколько версий на разных языках, он может перенаправлять пользователей на нужные версии в соответствии со значением заголовка.

Заголовок может передать информацию о нескольких языках. Как правило, первый из них является самым предпочтительным. Остальные языки из писка должны сопровождаться параметром q, который оценивает важность языка для пользователя. Значение параметра изменяется от 0 до 1.

В php значение Accept-Language хранится в переменной $_SERVER[‘HTTP_ACCEPT_LANGUAGE’].

//перенаправление на французскую версию сайта
if ( substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2) == 'fr' ) {  
	//отправляем с помощью php заголовок, перенаправляющий на другой домен.
	header ("Location: http://french.mydomain.com"); 
}
Accept-Encoding
Accept-Encoding: gzip,deflate

Большинство современных браузеров поддерживает метод сжатия Gzip, о чем они и сообщают в заголовке Accept-Encoding. Сервер может отправить страницу в сжатом виде. При этом объём трафика может уменьшиться до 80%, что довольно неплохо разгружает интернет канал сайтов.

В php значение Accept-Encoding хранится в переменной $_SERVER[«HTTP_ACCEPT_ENCODING»].

Так же можно использовать функцию ob_gzhandler(), которая проверяет значение Accept-Encoding автоматически.

//Разрешаем буфферизацию вывода.
//Если браузер поддерживает сжатие, то все данные на выходе будут сжаты

<?php

ob_start("ob_gzhandler");

?>
<html>
<body>

Эта страница будет сжата.

</html> <body>

If-Modified-Since

Браузеры по возможности кешируют страницы, которые вы посещаете. При повторных посещениях тех страниц браузер проверяет, не были ли те страницы изменены с момента последнего кеширования.

If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

Если страница не менялась с этой даты, то сервер отошлёт вместо html кода статус 304 Not Modified. А браузер, получив такой статус, будет загружать страницу из собственного кеша.

В php значение If-Modified-Since хранится в переменной $_SERVER[«HTTP_IF_MODIFIED_SINCE»]

// Предположим,  что $last_modify_time - время последнего изменения страницы   
  
// проверяем, отослал ли браузер заголовок If-Modified-Since  
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {  

	// если браузер закешировал последнюю версию файла  
     if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {  
   
         // отправляем 304 заголовок и ничего более.
		 header("HTTP/1.1 304 Not Modified");  
         exit;  
     }  
   
 }  
Cookie

Из названия ясно, что этот заголовок передаёт все куки, хранящиеся в браузере (уж извините, перевод «печенье» как-то не прижился в русском языке, поэтому куки я называю куками).

Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

Содержимое заголовка представляет из себя группы переменная=значение, разделённые точкой с запятой.

Часто именно в куках хранится идентификатор текущей сессии у пользователя. Реже он передаётся через url.

В php значения cookies доступны в массиве $_COOKIE. А доступ к переменным сессии идёт через массив $_SESSION.

Если требуется определить id сессии, не обязательно проверять cookie, можно воспользоваться функцией php session_id().

echo $_COOKIE['foo'];  
// результат: bar  
echo $_COOKIE['PHPSESSID'];  
// результат: r2t5uvjq435r4q7ib3vtdjq120  
session_start();  
echo session_id();  
// результат: r2t5uvjq435r4q7ib3vtdjq120  
Referer

Данный заголовок отправляет url сайта, с которого мы перешли на новую страницу.

Referer: http://www.borpost.ru/ 

Если вы с сайта А по ссылке переходите на сайт Б, то сайт Б получит заголовок Referer: А.

Из этого заголовка всевозможные системы статистики собирают информацию о поисковых запросах (если вы перешли из поисковика), о ссылках на сайт (если вы перешли с другого сайта).

Ещё этот заголовок часто используют при защите своих файлов от так называемого хот линкинга. Это когда владелец сайта А увидел на сайте Б картинку, захотел вставить её в свой сайт. Но он не скачал её и залил на свой хостинг, а взял и разместил ссылку прямо на сайт Б. получилось так:

<img src="Б/картинка" />

Теперь люди, заходя на сайт А видят картинку с сайта Б. При этом нагрузка основная идёт именно на сайт Б, а всё полезное забирает сайт А. Несправедливо, не так ли?

Но зато администратор сайта Б может защитить свои файлы от такой схемы. Ведь когда люди заходят на сайт А, их браузер ещё ничего не знает о картинке. Браузер получает только html код. Лишь в следующий момент он находит в коде ссылку на картинку и делает новый запрос:запрос картинки. В этом запросе заголовок referer уже будет содержать в себе имя сайта А.

Соответственно сервер сайта Б получает запрос с заголовком, содержащим чужой сайт, и для своей же защиты игнорирует этот запрос.

При этом, если люди заходят на сайт Б, их браузер тоже узнаёт о картинке лишь на следующий момент, создаёт новый запрос, но уже параметр referer содержит имя сайта Б. Сервер видит, что картинку запрашивают после запроса его же страницы, поэтому он выдаёт картинку без всяких вопросов.

Authorization

Когда веб-страница запрашивает авторизацию, которая была упомянута в прошлой статье, браузер открывает соответствующее окно для ввода логина и пароля. Вы вводите имя пользователя и пароль в этом окне, и браузер посылает еще один запрос HTTP, но на этот раз он содержит дополнительный заголовок заголовок Authorization.

Authorization: Basic bXl1c2VyOm15cGFzcw==  

Данные этого заголовка хранятся в формате base64

В php значение заголовка хранится как в $ _SERVER[‘PHP_AUTH_USER’], так и в $_SERVER[‘PHP_AUTH_PW’].
Ну вот и всё, кажется все самые частые заголовки в запросах рассмотрели.

Все темы на сайте

© 2017 BorPost · Копирование материалов сайта без разрешения запрещено