Вопрос

Мой вопрос касается того, как ответить на HTTP 304 "Не изменено", когда я получаю и то, и другое if-none-match и if-modified-поскольку из запроса прокси / клиента.

Из RFC 2616 , раздел 14.26 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26 ):

Если ни один из тегов объекта не совпадает, то сервер МОЖЕТ выполнить запрошенный метод, как если бы заголовок If-None-Match поле не существовало, но также должно игнорировать любой заголовок If-Modified-Since поле (поля) в запросе.То есть, если ни один из тегов объекта не совпадает, то сервер НЕ ДОЛЖЕН возвращать 304 (не измененный) ответ.

Я не уверен, что правильно понял это утверждение...

  1. "Если ни один из тегов сущности не совпадает" в PHP, говорят ли они о $_SERVER['HTTP_IF_NONE_MATCH'] против.мои этаги, которые я отправил ранее?
  2. Если я правильно понимаю это утверждение, как только ни один из ETags, перечисленных в $_SERVER['HTTP_IF_NONE_MATCH'] сопоставьте мои ETags, я прекращаю все проверки и обслуживаю страницу в обычном режиме.

Кто-нибудь может перевести эту часть RFC в псевдокод (или PHP-код) и / или ответить на мои 2 пункта выше?

ПРАВКА 1: Спасибо вам, Святой Воланд, за ваш ответ.Можете ли вы (или кто-нибудь еще) сказать мне, прав ли я по этим 6 пунктам:

  1. Формат $_SERVER['HTTP_IF_NONE_MATCH'] может быть либо:

    a)Если-Нет-Совпадение:"xyzzy", "r2d2xxxx", "c3piozzzz"

    б) Если-Нет-Совпадение:"ксиззи"

    и НЕ:

    c) Если-Нет-Совпадение:"xyzzy, r2d2xxxx, c3piozzzz"

  2. Если !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER), anyTagMatched() возвращает NULL.

  3. Как только ETag в $_SERVER['HTTP_IF_NONE_MATCH'] сопоставьте ETag моего документа, anyTagMatched() возвращает TRUE.

  4. Если ни один из этагов в $_SERVER['HTTP_IF_NONE_MATCH'] совпадают с ETag моего документа, anyTagMatched() возвращает FALSE.

  5. Если $_SERVER['HTTP_IF_MODIFIED_SINCE'] установлен и соответствует дате "последнего изменения" моего документа isExpired() возвращает FALSE, в противном случае возвращает TRUE.

  6. Как только anyTagMatched() возвращает TRUE, я выдаю значение 304.Если anyTagMatched() вернул значение NULL и isExpired() возвращено FALSE, я могу выдать значение 304.В любой другой ситуации я обслуживаю свою страницу в обычном режиме (я также публикую актуальные заголовки Last-Modified и ETag).

Это было полезно?

Решение

Это следует поместить в конец (передвинуть для лучшего обзора).

$anyTagMatched = anyTagMatched() ;
if( $anyTagMatched || ( ( null === $anyTagMatched ) && !isExpired() ) ) {
    notModified() ;
}
// Output content

Псевдокод (требуется проверка):

<?php

/**
 * Calculates eTag for the current resource.
 */
function calculateTag() {
}

/**
 * Gets date of the most recent change.
 */
function lastChanged() {
}

/**
 * TRUE if any tag matched
 * FALSE if none matched
 * NULL if header is not specified
 */
function anyTagMatched() {
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
        false ;

    if( false !== $if_none_match ) {
        $tags = split( ", ", $if_none_match ) ;
        $myTag = calculateTag() ;
        foreach( $tags as $tag ) {
            if( $tag == $myTag ) return true ;
        }
        return false ;
    }
    return null ;
}

function isExpired() {
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
        stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
        false;

    if( false !== $if_modified_since ) {
        // Compare time here; pseudocode.
        return ( $if_modified_since < lastChanged() ) ;
    }

    return true ;
}

function notModified() {
    header('HTTP/1.0 304 Not Modified');
    exit ;
}

Главный ответ здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top