Могу ли я использовать "HTTP-заголовок", чтобы проверить, была ли изменена динамическая страница - PullRequest
5 голосов
/ 15 октября 2008

Вы можете запросить заголовок http, чтобы проверить, была ли отредактирована веб-страница, посмотрев на ее дату, но как насчет динамических страниц, таких как - php, aspx, которые получают свои данные из базы данных?

Ответы [ 5 ]

2 голосов
/ 25 октября 2008

Даже если вы думаете, что она устарела, я всегда находил статью Саймона Уиллисона о Условный 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 .

1 голос
/ 15 октября 2008

Это точное назначение заголовка ETag , но оно должно поддерживаться вашей веб-средой, или вам нужно следить за тем, чтобы ваше приложение правильно отвечало на запросы с заголовками If-Match , If-Not-Match и If-Range (см. HTTP Ch 3.11 ).

0 голосов
/ 15 октября 2008

Заголовок Last-Modified будет полезен вам только в том случае, если программист сайта явно установит его для возврата.

Для обычной статической страницы Last-Modified - это отметка времени последней модификации файла HTML. Для динамически генерируемой страницы сервер не может надежно назначить значение Last-Modified, поскольку у него нет реального способа узнать, как содержимое изменилось в зависимости от запроса, поэтому многие серверы вообще не генерируют заголовок.

Если у вас есть контроль над страницей, то проверка того, что заголовок Last Modified установлен, обеспечит успешную проверку Last-Modified. В противном случае вам, возможно, придется получить страницу и выполнить регулярное выражение, чтобы найти измененный раздел (например, дату / время в заголовке сайта новостей). Если такого очевидного маркера не существует, то я рекомендую предложение Оли MD5 в содержании страницы, чтобы убедиться, что оно изменилось.

0 голосов
/ 15 октября 2008

Да, вы можете и должны использовать заголовки HTTP, чтобы пометить страницы как устаревшие. Если они динамические (PHP, ASPX и т. Д.) И / или управляются базой данных, вам необходимо вручную управлять настройкой заголовка Expires / отправкой HTTP Not Modified соответствующим образом. В ASP.NET для этого есть несколько объектов SqlDependency, но их все еще необходимо настроить и управлять ими. (Не уверен, что в PHP есть что-то похожее, но, возможно, в PEAR что-то есть, если нет ...)

0 голосов
/ 15 октября 2008

Вы можете, если он правильно использует заголовки HTTP-ответа, но его часто упускают из виду.

В противном случае хранение локального md5-хэша контента может быть полезным для вас (если нет более простой строки в контенте, которую вы могли бы подключить). Это не идеально (потому что это довольно медленный процесс), но это вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...