Xpoint
   [напомнить пароль]

GET-запрос с условием (Conditional GET)

Conditional GET (или GET с условием) — это очень полезная возможность HTTP-протокола, позволяющая заметно сэкономить трафик и нагрузку, как клиенту, так и серверу. Клиент в GET-запросе уточняет, что хочет получить страницу только если она была изменена с момента последнего обращения клиента. Если страница была изменена, то сервер возвращает её, в противном случае он выдаёт специальный HTTP-ответ “304 Not Modified”, означающий, что страница не изменилась.

Оглавление

С точки зрения клиента

Для того, чтобы клиент мог послать GET-запрос с условием, сервер должен выдавать страницы хотя бы с одним из следующих HTTP-заголовков: Last-Modified и ETag. При загрузке страницы клиент запоминает значения этих заголовков. В простейшем случае клиенту не обязательно каким-то образом их интерпретировать, достаточно просто запомнить, хотя возможна и более сложная логика работы с кэшем.

При следующем обращении к серверу, клиент включает в GET-запрос один из или оба заголовка:
If-Modified-Since — со значением, полученным ранее из Last-Modified
If-None-Match — со значением, полученным ранее из ETag.

С точки зрения сервера

Как было сказано выше, сервер должен выдавать страницы с заголовками Last-Modified и/или ETag. Соответственно, сервер должен уметь интерпретировать заголовки If-Modified-Since и/или If-None-Match.

Last-Modified и If-Modified-Since оперируют временем, когда данный документ был в последний раз изменён. Это может быть время последнего изменения для статического файла или временем генерации последней новости для страницы со списком новостей (или, например, для RSS-канала). Сервер, получив запрос с If-Modified-Since, должен проверить, не изменился ли с того момента запрашиваемый документ, и, если он НЕ изменился, выдать ответ “304 Not Modified” (без самого документа), а если изменился — выдать сам документ со стандартным кодом “200 OK”.

ETag и If-None-Match используют так называемый Entity Tag — некую уникальную строку, характеризующая данную версию запрашиваемого документа. Entity Tag может быть «строгим» (два документа имеют одинаковые ETags только если они совпадают побитово) или «нестрогим» (два документа имеют одинаковые ETags если они совпадают по содержанию, но могут отличаться в незначительных деталях). Для файла «строгим» ETag-ом может быть, например, его md5-хэш, а для динамической страницы «нестрогим» ETag-ом может быть md5-хэш её основного содержимого (без учёта дизайна и баннеров). Строгий ETag-заголовок имеет формат "строка", а нестрогий W/"строка", где строка (без кавычек) — собственно Entity Tag. Сервер, получив запрос с If-None-Match, должен проверить совпадает ли текущий ETag документа с запрошенным, и, если он НЕ изменился, выдать ответ “304 Not Modified”, а если изменился — выдать сам документ со стандартным кодом “200 OK”.

Где применяется?

  • RSS — RSS-reader периодически запрашивает RSS-feed, и ответ сервера имеет смысл только в том случае, если документ действительно был изменен. В случае RSS, кроме выдачи “304 Not Modified”, скрипт может использовать дату, присланую клиентом в заголовке If-Modified-Since, и выдать только те элементы, которые были созданы или изменились после этой даты — таким образом будет сэкономлен трафик и в том случае, что данные изменились.
  • Веб-камера, обновляющаяся картинка — периодически меняющаяся картинка (новый кадр веб-камеры, обновленный статистический график) может выдавать “304 Not Modified” до тех пор, пока не будут доступны новые данные.
  • Изображения, отдающиеся клиенту при помощи скрипта — все браузеры стараются по возможности не загружать лишний раз изображения (используя Conditional GET), поэтому имеет смысл им в этом помочь.
  • Обычные веб-страницы, генерируемые скриптом — к примеру, пользователь может несколько раз в минуту обновлять страницу форума, чтобы увидеть новые сообщения. Если их нет, то есть страница не изменилась, можно отдавать “304 Not Modified” и экономить трафик пользователя.
  • ... (впишите ваши варианты — чем больше, тем лучше)

См. также

Powered by POEM™ Engine Copyright © 2002-2005