HTTP if-none-match и if-modified-since и 304 разъяснения в PHP

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

От раздела 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. Если я понимаю правильно этот оператор, как только ни один из Завершающих тегов, перечисленных в $_SERVER['HTTP_IF_NONE_MATCH'] соответствуйте моим Завершающим тегам, я останавливаю все проверки и обычно служу странице.

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

РЕДАКТИРОВАНИЕ 1: Thank you St. Woland для Вашего ответа. Можете Вы (или кто-либо еще) говорите мне, если я корректен на этих 6 точках:

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

    a) If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"

    b) If-None-Match: "xyzzy"

    и НЕТ:

    c) If-None-Match: "xyzzy, r2d2xxxx, c3piozzzz"

  2. Если !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER), anyTagMatched () возвращает ПУСТОЙ УКАЗАТЕЛЬ.

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

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

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

  6. Как только anyTagMatched() возвраты ПРАВДА, я выпускаю 304. Если anyTagMatched () возвратил ПУСТОЙ УКАЗАТЕЛЬ и isExpired() возвращенный FALSE я могу выпустить 304. В любой другой ситуации я служу своей странице в качестве нормальной (я также выпускаю Измененное в последний раз актуальное и заголовки Завершающего тега).

8
задан AlexV 16 September 2015 в 12:54
поделиться

1 ответ

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

$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 ;
}

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

5
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: