PHP - Запросы от браузера к серверу
PHP - Урок 2 (Запросы от браузера к серверу)
Чего тебе надобно, старче
Самой популярной программой для работы с WEB является браузер. Он обращается к серверу по протоколу TCP/IP и отправляет специально отформатированный запрос, который затем сервер разбирает на части, и узнает чего-же нужно отправить в ответ клиентской программе.Теперь разберем как выглядит такой запрос. Для общения с сервером клиент использует протокол HTTP - это протокол уровня приложений. Как бы еще одна матрешка, вложенная в TCP. Запрос как и у TCP (да и если вы читали мой курс про сети, уже догадались - все остальные уровни сетевой модели) содержит заголовки и собственно данные. Однако теперь заголовки нужны уже непосредственно самим программам, которые взаимодействуют в интернете. (у TCP как мы помним, заголовки использовались для установки соединения самой подсистемой TCP, которая является обычно частью операционной системы, а заголовки IP по большей части используются маршрутизаторами).
У протокола HTTP есть набор методов, которые сообщают серверу, какое действие хочет от него клиент (GET - что то получить, POST-что-то передать и получить. Есть еще другие HEAD, PUT, DELETE - получение только заголовка ответа, что-то записать и удаление чего-либо, однако они используются редко, хотя они используются редко. Да могут быть и другие, например OPTIONS и т.д Однако все зависит от реализации сервера, например CouchDB использует их для работы с данными.)
Итак рассмотрим пример. Пользователь вводит адрес в адресную строку и нажимает ENTER (или кликает по ссылке - что для браузера равнозначно). В результате чего браузер получает событие, говорящее что нужно сформировать и отправить запрос к серверу. А также получает саму ссылку. Допустим это будет http://thesite.ru/test/page.html
.
Браузер формирует следующий запрос имеющей следующую структуру
МЕТОД ПУТЬ_К_ФАЙЛУ_НА_СЕРВЕРЕ ВЕРСИЯ_ПРОТОКОЛА_HTTP
ЗАГОЛОВКИ
ПУСТАЯ СТРОКА
ДАННЫЕ ПЕРЕДАВАЕМЫЕ НА СЕРВЕР (Если есть)
Например
GET /test/page.html HTTP1.1
Host: thesite.ru
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
(пустая строка)
Как вы видите браузер преобразовал запрос на несколько частей. А также добавил дополнительные заголовки. Разберем по-порядку:
GET /test/page.html HTTP1.1
В самом начале название метода - буквально переводится как (ПОЛУЧИТЬ или просто ДАЙ), затем идет путь к файлу, который в самом простом случае отмеряется от папки с сайтом (об этом мы еще поговорим). Затем идет версия протокола - чтобы сервер не забыл в каком формате ему отвечать (ну а вдруг понадобится HTTP2.0).- Затем идет перечисление заголовков. Очень важный заголовок
Host: thesite.ru
- он указывает доменное имя сайта - в нашем случае это thesite.ru. По нему DNS сервер будет определять IP куда следует направить запрос, а также по прибытию на нужный сервер, он может обслуживать много сайтов, с разными доменами (виртуальных хостов (в apache) или как иногда их называют сервер-блоков (в nginx). По имени хоста сервер как раз и отличает какой сайт запрашивает клиент (IP-то одинаковый у сервера). Об этом мы также вскоре поговорим.
Другие заголовки несут вспомогательный характер, например могут содержать название и версию браузера User-Agent, тип файла, который ожидает в ответ клиент Accept: text/html и многое другое. - Затем идет пустая строка, чтобы указать серверу, что заголовки закончились и далее могут быть любые данные, например логин и пароль, а могут и не быть.
Затем это все передается от уровня приложений (нашего браузера) транспортному уровню.
Затем для PHP - программиста вполне можно считать, что этот запрос передается на сервер.
Если же вам интересно его путешествие полностью, то читайте мои статьи про сети