Даже если вы думаете, что она устарела, я всегда находил статью Саймона Уиллисона о Условный GET более чем полезной. Пример написан на PHP, но он настолько прост, что вы можете адаптировать его к другим языкам. Вот пример:
function doConditionalGet($timestamp) {
// A PHP implementation of conditional get, see
// http://fishbowl.pastiche.org/archives/001132.html
$last_modified = substr(date('r', $timestamp), 0, -5).'GMT';
$etag = '"'.md5($last_modified).'"';
// Send the headers
header("Last-Modified: $last_modified");
header("ETag: $etag");
// See if the client has provided the required headers
$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
false;
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) :
false;
if (!$if_modified_since && !$if_none_match) {
return;
}
// At least one of the headers is there - check them
if ($if_none_match && $if_none_match != $etag) {
return; // etag is there but doesn't match
}
if ($if_modified_since && $if_modified_since != $last_modified) {
return; // if-modified-since is there but doesn't match
}
// Nothing has changed since their last request - serve a 304 and exit
header('HTTP/1.0 304 Not Modified');
exit;
}
При этом вы можете использовать HTTP-глаголы GET или HEAD (я думаю, что это также возможно с другими , но я не вижу причины для используй их). Все, что вам нужно сделать, это добавить If-Modified-Since
или If-None-Match
с соответствующими значениями заголовков Last-Modified
или ETag
, отправленных предыдущей версией страницы. Начиная с версии HTTP 1.1 рекомендуется ETag
сверх Last-Modified
, но оба будут работать.
Это очень простой пример того, как работает условный GET. Для начала нам нужно извлечь страницу обычным способом:
GET /some-page.html HTTP/1.1
Host: example.org
Первый ответ с условными заголовками и содержимым:
200 OK
ETag: YourETagHere
Теперь запрос условного получения:
GET /some-page.html HTTP/1.1
Host: example.org
If-None-Match: YourETagHere
И ответ, указывающий, что вы можете использовать кэшированную версию страницы, так как будут доставлены только заголовки:
304 Not Modified
ETag: YourETagHere
При этом сервер уведомил вас, что на странице не было изменений.
Я также могу порекомендовать вам еще одну статью об условном GET: HTTP условный GET для хакеров RSS .