HTTP написан протоколом передачи гипертекста. Вся Всемирная паутина использует этот протокол. Почти большая часть контента, который вы видите в своем браузере, передается через протокол HTTP, такой как эта статья.
Заголовки HTTP являются http -запросами и соответствующими ядрами, а также содержат информацию о клиентских браузерах, страницах запросов, серверах и т. Д.
Когда вы вводите URL -адрес в адресной строке браузера, ваш браузер будет аналогичен следующему HTTP -запросу:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Хост: net.tutsplus.com
Пользовательский агент: Mozilla/5.0 (Windows; U; Windows NT 6.1; En-US; RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.net Clr 3.5.30729)
Принять: text/html, приложение/xhtml+xml, приложение/xml; q = 0,9,*/*; q = 0,8
Принятие языка: en-us, en; q = 0,5
Принять по кодировке: gzip, дефту
Принятие-Чарсет: ISO-8859-1, UTF-8; Q = 0,7,*; Q = 0,7
Keep-Alive: 300
Соединение: Keep-Alive
Cookie: phpsessid = r2t5uvjq435r4q7ib3vtdjq120
Прагма: без кеша
Контроль кэша: без кеша
Первая строка называется строкой запроса. Он описывает основную информацию этого запроса, а остальное - заголовки HTTP.
После завершения запроса ваш браузер может получить следующий HTTP -ответ:
HTTP/1.x 200 OK
Кодирование передачи: кусочке
Дата: сб, 28 ноября 2009 г. 04:36:25
Сервер: LiteSpeed
Соединение: Закрыть
X-Power-By: W3 Total Cache/0,8
Прагма: публичная
Истекает: сб, 28 ноября 2009 г. 05:36:25
ETAG: PUB1259380237; GZ
Контроль кэша: максимальный возраст = 3600, общественный
Контент-тип: текст/html; charset = utf-8
Последние модифицированные: сб, 28 ноября 2009 г. 03:50:37
X-Pingback: http://net.tutsplus.com/xmlrpc.php
Контент-кодирование: Gzip
Варьируется: принять, cookie, пользовательский агент
<!-... остальная часть HTML ...->
Первая строка называется строкой состояния, за которой следует заголовки HTTP. После того, как пустая строка будет завершена, контент будет выведен (в данном случае, какой -то вывод HTML).
Но вы не можете видеть HTTP -заголовки, когда смотрите на исходный код страницы, хотя они отправляются в браузер вместе с тем, что вы можете увидеть.
Этот HTTP -запрос также отправляет некоторые запросы на получение других ресурсов, таких как изображения, файлы CSS, файлы JS и т. Д.
Давайте посмотрим на детали ниже.
Следующие расширения Firefox могут помочь вам проанализировать заголовки HTTP:
1. Firebug
2. Live Http заголовки
3. В PHP:
Ниже статьи вы увидите несколько примеров использования Demonation PHP.
Первая строка, называемая первой строкой, содержит три части:
Остальные разделы - это каждая строка с именем: пара значений. Они содержат разнообразную информацию о запросах и вашем браузере. Например, пользовательский агент указывает на вашу версию браузера и операционную систему, которую вы используете. Принятие кодирования сообщит серверу, что ваш просмотр может принять сжатый вывод, аналогичный GZIP.
Большинство из этих заголовков являются необязательными. HTTP -запросы могут даже быть уменьшены до этого:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Хост: net.tutsplus.com
И вы все равно можете получить допустимый ответ от сервера.
Три наиболее распространенных типа запросов: Get, Post и Head. Возможно, вы уже знакомы с первыми двумя во время процесса написания HTML.
Большинство HTML, Images, JS, CSS, ... которые передаются в браузер, запрашиваются с помощью метода GET. Это главный способ получить данные.
Например, чтобы получить статью Nettus+, первая строка HTTP -запроса обычно выглядит так:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Как только HTML загружен, браузер отправит запрос GET, чтобы получить изображение, как это:
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
Форма также может быть отправлена через метод получения. Вот пример:
<form action=foo.php method=GET>
Имя: <input name = first_name type = text />
Фамилия: <Имя ввода = THEAL_NAME TYPE = TEXT />
<name name = action type = отправить значение = отправить />
</form>
Когда эта форма будет отправлена, HTTP -запрос будет выглядеть следующим образом:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
Вы можете отправить ввод формы на сервер, добавив его на строку запроса.
Хотя вы можете прикрепить данные к URL -адресу с помощью метода GET для передачи их на сервер, более целесообразно использовать POST для отправки данных на сервер во многих случаях. Нереально отправлять большой объем данных через GET, и у него есть определенные ограничения.
Обычно использовать запросы POST для отправки данных формы. Давайте изменим приведенный выше пример для использования Post:
<form action=foo.php method=POST>
Имя: <input name = first_name type = text />
Фамилия: <Имя ввода = THEAL_NAME TYPE = TEXT />
<name name = action type = отправить значение = отправить />
</form>
Отправка этой формы создаст HTTP -запрос следующим образом:
POST /foo.php HTTP/1.1
Ведущий: Localhost
Пользовательский агент: Mozilla/5.0 (Windows; U; Windows NT 6.1; En-US; RV: 1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.net Clr 3.5.30729)
Принять: text/html, приложение/xhtml+xml, приложение/xml; q = 0,9,*/*; q = 0,8
Принятие языка: en-us, en; q = 0,5
Принять по кодировке: gzip, дефту
Принятие-Чарсет: ISO-8859-1, UTF-8; Q = 0,7,*; Q = 0,7
Keep-Alive: 300
Соединение: Keep-Alive
Реферат: http: //localhost/test.php
Тип контента: приложение/x-www-form-urlencoded
Длина контента: 43
First_name = John & last_name = doe & action = отправить
Вот три вещи, чтобы отметить:
Запросы на методы публикации также могут использоваться в Ajax, приложениях, Curl…. И все формы загрузки файлов необходимы для использования POST.
Голова и Get очень похожи, за исключением того, что Head не принимает содержание части HTTP -ответа. Когда вы отправляете запрос на голову, это означает, что вас интересуют только заголовок HTTP, а не сам документ.
Этот метод позволяет браузеру определить, была ли страница изменена, и, таким образом, управлять кэшем. Также можно определить, существует ли запрошенный документ.
Например, если у вас есть много ссылок на вашем веб -сайте, вы можете просто отправить им запросы на головы отдельно, чтобы определить, есть ли мертвые ссылки, что намного быстрее, чем использование GET.
Когда браузер отправляет HTTP -запрос, сервер ответит на запрос через HTTP -ответ. Если вы не заботитесь о контенте, то запрос будет выглядеть так:
Первая ценная информация - это соглашение. В настоящее время сервер будет использовать HTTP/1.x или HTTP/1.1.
Далее краткое сообщение представляет статус. Код 200 означает, что наш запрос был успешно отправлен, и сервер вернет запрошенный документ после информации заголовка.
Мы все видели страницу 404. Когда я запрашиваю путь, который не существует на сервере, сервер отвечает нам 404 вместо 200.
Остальная часть ответа аналогична HTTP -запросу. Это о программном обеспечении сервера, когда страницы/файлы были изменены, тип MIME и т. Д.
Точно так же эта информация о заголовке является необязательной.
Как упомянуто выше, 200 используется для указания, что запрос успешно.
206 Частичное содержаниеЕсли приложение запрашивает файлы только в определенном диапазоне, оно вернется 206.
Обычно это используется для загрузки загрузки, продолжения точки останова или загрузки файлов.
404 не найденЭто легко понять
401 несанкционированЗащищенные паролем страницы вернутся к этому статусу. Если вы не введете правильный пароль, вы увидите следующую информацию в своем браузере:
Обратите внимание, что это просто защищенная паролем страница. Всплывающее окно, которое просит ввести пароль, выглядит так:
403 запрещеноЕсли у вас нет разрешения на доступ к странице, она вернется к статусу 403. Обычно это происходит, когда вы пытаетесь открыть папку без индексной страницы. Если настройки сервера не позволяют просмотреть содержимое каталога, вы увидите ошибку 403.
Другие методы также отправляют ограничения разрешений, такие как вы можете заблокировать их через свой IP -адрес, который требует некоторой помощи HTACCESS.
order allow,deny
Отрицание с 192.168.44.201
Отрицание с 224.39.163.12
Отрицание с 172.16.7.92
разрешить от всех
302 (или 307) временно перемещался, и 301 перемещался навсегдаЭти два состояния появятся, когда браузер перенаправляет. Например, вы используете сервис укорочения URL, такую как bit.ly. Это также, как они знают, кто щелкнул на их ссылку.
302 и 301 очень похожи на браузеры, но есть некоторые различия для сканеров поисковых систем. Например, если ваш веб -сайт поддерживается, вы перенаправляете клиентский браузер на другой адрес с 302. Поисковые сканеры в будущем повторно переведут вашу страницу. Но если вы используете 301 перенаправление, это означает, что вы сообщите поисковому гусеницу: ваш сайт был навсегда перенесен на новый адрес.
500 Ошибка сервера (внутренняя ошибка сервера)Этот код обычно появляется при сбое сценария страницы. Большинство сценариев CGI не выводят сообщения об ошибках в браузер, как PHP. Если возникает фатальная ошибка, они отправят только код состояния 500. В настоящее время вам необходимо проверить журнал ошибок сервера для устранения неполадок.
Полный списокВы можете найти полное описание кода состояния HTTP здесь. Или проверьте это здесь (http://tools.vevb.com/table/http_status_code).
Теперь давайте посмотрим на какую -то общую информацию о запросах HTTP в заголовках HTTP.
Вся эта информация о заголовке можно найти в массиве PHP $ _server. Вы также можете использовать функцию getallheaders (), чтобы получить всю информацию о заголовке одновременно.
HTTP -запрос будет отправлен на определенный IP -адрес, но большинство серверов имеют возможность размещать несколько веб -сайтов по одному IP -адресу, поэтому сервер должен знать, какое доменное имя запрашивает браузер.
Host: rlog.cn
Это всего лишь базовое имя хоста, включая доменные имена и доменные имена дочерних доменов.
В PHP вы можете просмотреть его через $ _server ['http_host'] или $ _server ['server_name'].
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Эта голова может нести следующую информацию:
Это общий метод, используемый некоторыми веб -сайтами для сбора информации о посетителях. Например, вы можете сказать, использует ли посетитель ваш телефон для посещения вашего веб -сайта, а затем решить, направлять их на мобильный веб -сайт, который хорошо работает в низком разрешении.
В PHP пользовательский агент может быть получен через $ _server ['http_user_agent']
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
Эхо, пожалуйста, перестаньте использовать IE6!;
}
Accept-Language: en-us,en;q=0.5
Эта информация может указывать на настройки языка по умолчанию пользователя. Если на веб -сайте есть другая языковая версия, вы можете использовать эту информацию для перенаправления браузера пользователя.
Это может быть переносится на нескольких языках путем сегментации запятой. Первым будет предпочтительный язык, а другие языки будут нести значение Q, чтобы указать предпочтение пользователя языку (0 ~ 1).
Используйте $ _server [http_accept_language] в PHP, чтобы получить эту информацию.
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
Заголовок ('Местоположение: http://french.mydomain.com');
}
Accept-Encoding: gzip,deflate
Большинство современных браузеров поддерживают сжатие GZIP и сообщат эту информацию на сервер. В настоящее время сжатый HTML будет отправлен в браузер. Это может уменьшить размер файла почти на 80%, чтобы сэкономить время загрузки и пропускную способность.
Эта информация может быть получена с использованием $ _server [http_accept_encoding] в php. Затем значение будет автоматически обнаружено при вызове метода ob_gzhandler (), поэтому вам не нужно вручную обнаруживать его.
// enables output buffering
// и все выходные данные сжимаются, если браузер поддерживает его
ob_start ('ob_gzhandler');
Если в вашем браузере была кэширована страница, в следующий раз, когда вы будете просматривать браузер
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Если он не был изменен с тех пор, сервер возвращает 304 не изменяется и не вернет контент. Браузер автоматически прочитал контент в кэше
В PHP вы можете использовать $ _server ['http_if_modified_since'] для обнаружения.
// assume $last_modify_time was the last the output was updated
// Отправил ли браузер, если модифицированный заголовок с модифицированным?
if (isset ($ _ server ['http_if_modified_since'])) {
// Если кэш браузера соответствует измененному времени
if ($ fast_modify_time == strtotime ($ _ server ['http_if_modified_since'])) {
// Отправить заголовок 304, и нет контента
Заголовок (http/1,1 304 не изменен);
Выход;
}
}
Существует также заголовок HTTP под названием ETAG, который используется для определения того, является ли кэшированная информация правильной, и мы объясним это позже.
Как следует из названия, оно отправит информацию о файле cookie, хранящуюся в вашем браузере на сервер.
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
Это набор пар именных значений, разделенных на полуколоны. Файлы cookie также могут включать идентификатор сеанса.
В PHP можно получить единый файл cookie, доступ к массиву $ _cookie. Вы можете напрямую использовать массив $ _Session, чтобы получить переменную сеанса. Если вам нужен идентификатор сеанса, то вы можете использовать функцию session_id () вместо cookie.
echo $_COOKIE['foo'];
// Вывод: бар
echo $ _cookie ['phpsessid'];
// Выход: R2T5UVJQ435R4Q7IB3VTDJQ120
session_start ();
echo session_id ();
// Выход: R2T5UVJQ435R4Q7IB3VTDJQ120
Как следует из названия, заголовок будет содержать ссылку на URL -информацию.
Например, я посетил домашнюю страницу Nettus+ и нажал на ссылку, и этот заголовок будет отправлен в браузер:
Referer: http://net.tutsplus.com/
В PHP значение может быть получено с помощью $ _server ['http_referer'].
if (isset($_SERVER['HTTP_REFERER'])) {
$ url_info = parse_url ($ _ server ['http_referer']);
// Серфер приходит из Google?
if ($ url_info ['host'] == 'www.google.com') {
parse_str ($ url_info ['Query'], $ vars);
Эхо, которое вы искали в Google по этому ключевому слову :. $ vars ['Q'];
}
}
// Если ссылочный URL был:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+Headers&aq=f&oq=&aqi=g-p1g9
// Вывод будет:
// вы искали в Google по этому ключевому слову: HTTP заголовки
Возможно, вы заметили, что слово реферат неправильно написан в качестве реферата. К сожалению, это превратило в официальные характеристики HTTP, подобные этой и застряли.
Когда страница требует авторизации, браузер появится окно входа в систему. После ввода правильной учетной записи браузер отправит HTTP -запрос, но он будет содержать заголовок:
Authorization: Basic bXl1c2VyOm15cGFzcw==
Эта часть информации, содержащейся в заголовке, кодирована Base64. Например, base64_decode ('bxl1c2vyom15cgfzcw ==') будет преобразован в «myuser: mypass».
В PHP это значение можно получить с помощью $ _server ['php_auth_user'] и $ _server ['php_auth_pw'].
Мы объясним более подробную информацию в разделе www-authenticate.
Теперь позвольте мне понять некоторую информацию о ответе HTTP в общих заголовках HTTP.
В PHP вы можете установить информацию о ответе заголовка через header (). PHP автоматически отправила некоторую необходимую информацию о заголовке, такую как загруженный контент, настройка файлов cookie и т. Д. Вы можете увидеть отправленную и отправлять функцию headers_list (). Вы также можете использовать функцию headers_sent (), чтобы проверить, была ли отправлена информация заголовка.
W3.ORG определяется как: поле общего заголовка контроля кэша используется для указания директив, которые должны соблюдать все механизмы кэширования вдоль цепочки запроса/отклика. Где механизмы кэширования содержат некоторую информацию о шлюзе и прокси, которую может использовать ваш интернет -провайдер.
Например:
Cache-Control: max-age=3600, public
Общественность означает, что ответ может быть кэширован любым, а Max-Age указывает количество секунд, которое кэш действителен. Позволяет значительно улучшить скорость загрузки браузеров, а также повысить квалификацию.
Вы также можете отключить кэш, установив команду без Cache:
Cache-Control: no-cache
Для получения более подробной информации см. W3.org.
Этот заголовок содержит тип MIME документа. Браузер решит, как проанализировать документ на основе этого параметра. Например, HTML -страница (или страница PHP с выводом HTML) вернет что -то вроде этого:
Content-Type: text/html; charset=UTF-8
«Текст» - это тип документа, а «html» - это подтип документа. Этот заголовок также включает в себя больше информации, такой как Charset.
Если это картина, такой ответ будет отправлен:
Content-Type: image/gif
Браузер может использовать тип MIME, чтобы решить, использовать ли внешние программы или расширить сам документ. Следующий пример понижает вызов Adobe Reader:
Content-Type: application/pdf
Загрузите непосредственно, Apache обычно автоматически осуждает тип документа MIME и добавляет соответствующую информацию в заголовок. Более того, большинство браузеров имеют определенную степень устойчивости к ошибкам. Если заголовок не предоставляет или предоставляет информацию неправильно, он автоматически обнаружит тип MIME.
Вы можете найти список часто используемых типов MIME.
В PHP вы можете использовать finfo_file () для обнаружения типа IME файла.
Этот заголовок сообщит браузеру открыть окно загрузки файла вместо того, чтобы пытаться проанализировать содержимое ответа. Например:
Content-Disposition: attachment; filename=download.zip
Это заставляет браузер иметь такого диалога:
Обратите внимание, что информация о заголовке типа контента, которая также подходит для него.
Content-Type: application/zip
Контент-распада: привязанность; filename = download.zip
Когда контент должен быть передан в браузер, сервер может использовать этот заголовок, чтобы информировать браузер о размере (байты) файла, который для передачи.
Content-Length: 89123
Эта информация весьма полезна для загрузки файлов. Вот почему браузер знает прогресс загрузки.
Например, здесь я написал виртуальный скрипт для моделирования медленной загрузки.
// it's a zip file
заголовок ('контент-тип: приложение/Zip');
// 1 миллион байтов (около 1 мегабайта)
Заголовок («Длина контента: 1000000»);
// Загрузить диалог загрузки и сохранить его как загрузка.
Header ('Content-Disposition: Attachment; filename = download.zip');
// 1000 раз 1000 байтов данных
для ($ i = 0; $ i <1000; $ i ++) {
echo str_repeat (., 1000);
// спать, чтобы замедлить загрузку
Unsleep (50000);
}
Результат будет таким:
Теперь я комментирую заголовок длины содержимого:
// it's a zip file
заголовок ('контент-тип: приложение/Zip');
// Браузер не узнает размер
// заголовок ('длина контента: 1000000');
// Загрузить диалог загрузки и сохранить его как загрузка.
Header ('Content-Disposition: Attachment; filename = download.zip');
// 1000 раз 1000 байтов данных
для ($ i = 0; $ i <1000; $ i ++) {
echo str_repeat (., 1000);
// спать, чтобы замедлить загрузку
Unsleep (50000);
}
Результатом стало следующим образом:
Этот браузер только расскажет вам, сколько вы загрузили, но не скажете вам, сколько вам нужно загрузить всего. И план прогресса не покажет прогресс.
Это еще одна информация заголовка, созданная для кеша. Это будет выглядеть так:
Etag: pub1259380237;gz
Сервер может ответить на эту информацию с помощью каждого отправленного файла в браузер. Это значение может содержать последнюю измененную дату, размер файла или контроль файла документа. Просмотр будет кэшировать его с полученным документом. В следующий раз, когда браузер снова запрашивает тот же файл, будет отправлен следующий HTTP -запрос:
If-None-Match: pub1259380237;gz
Если запрашиваемое значение ETAG документа согласуется с ним, сервер отправит код состояния 304 вместо 2OO. И не возвращается контент. В настоящее время браузер загрузит файл из кэша.
Как следует из названия, эта информация заголовка использует формат GMT, чтобы указать последнее время изменения документа:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
Заголовок (последний модифицированный:. Gmdate (D, D Myh: i: s, $ modify_time). Gmt);
Это обеспечивает еще один механизм кэширования. Браузер может отправить запрос таким:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Мы уже обсуждали это в разделе IF-модифицированной и сумасшедшей.
Этот заголовок используется для перенаправления. Если код ответа составляет 301 или 302, сервер должен отправить заголовок. Например, когда вы посещаете http://www.nettus.com, браузер получит следующий ответ:
HTTP/1.x 301 Moved Permanently
...
Местоположение: http://net.tutsplus.com/
...
В PHP вы можете перенаправить посетителей таким образом:
header('Location: http://net.tutsplus.com/');
По умолчанию будет отправлен код состояния 302. Если вы хотите отправить 301, просто напишите это так:
header('Location: http://net.tutsplus.com/', true, 301);
Когда веб -сайт должен установить или обновить информацию о файлах cookie, которую вы просматриваете, он будет использовать такой заголовок:
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: Session-ID = 120-7333518-8165026; path =/; Domain = .amazon.com; истекает = сб 27 февраля 08:00:00 2010 GMT
Каждое печенье будет использоваться в качестве отдельного заголовка. Обратите внимание, что установка файлов cookie через JS не будет отражена в заголовке HTTP.
В PHP вы можете установить файлы cookie через функцию SetCookie (), а PHP отправит соответствующие заголовки HTTP.
setcookie(TestCookie, foobar);
Он отправит заголовок, как это:
Set-Cookie: TestCookie=foobar
Если время истечения не указано, печенье будет удалено после закрытия браузера.
Веб -сайт может отправить эту информацию в заголовке через HTTP, чтобы проверить пользователей. Откроется всплывающее окно, когда браузер увидит этот ответ в голове.
WWW-Authenticate: Basic realm=Restricted Area
Это будет выглядеть так:
В главе руководства PHP есть простой код, который демонстрирует, как сделать что -то подобное с помощью PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
заголовок ('www-authenticate: basic realm = my realm');
Заголовок ('http/1,0 401 несанкционированный');
Echo 'Text для отправки, если пользователь попадает в кнопку отмены';
Выход;
} еще {
echo <p> hello {$ _server ['php_auth_user']}. </p>;
echo <p> вы ввели {$ _server ['php_auth_pw']} в качестве пароля. </p>;
}
Этот заголовок обычно устанавливается при сжатии обратного контента.
Content-Encoding: gzip
В PHP, если вы называете функцию ob_gzhandler (), этот заголовок будет автоматически установлен.
Оригинальный адрес: http://css9.net/all-about-http he-ders/