Intereting Posts
Запустить PHP-код внутри JavaScript? Будет ли это нормально использовать? Используйте AJAX для отображения генерируемого php изображения Как использовать CASE WHEN в предложении WHERE? добавить встроенное изображение в сообщение, отправленное с помощью swiftmailer Добавление элемента в ассоциативный массив Принудительная перезагрузка / обновление при нажатии кнопки «Назад» разница между $ query> num_rows () и $ this-> db-> count_all_results () в CodeIgniter и которая рекомендуется Разница между <? Php и <? Расширение почтовой рассылки php повышает четкие уведомления Использование конфигурации apache для указания директории PHP include для каждого сайта Получите секунды до конца дня в PHP Как получить идентификатор пользователя facebook из моего приложения? как назначить значение переменной javascript переменной php Как плагины WordPress добавляют контент? Получите звание, основанное на баллах, из неупорядоченной базы данных MySql, когда ему дали имя пользователя

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

Мой вопрос в том, как ответить HTTP 304 «Not Modified», когда я получаю как 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'] против моих ETags, которые я отправил ранее?
  2. Если я правильно понимаю это утверждение, как только ни один из ETags, перечисленных в $_SERVER['HTTP_IF_NONE_MATCH'] соответствует моим ETags, я останавливаю все проверки и обычно обслуживаю страницу.

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

РЕДАКТИРОВАТЬ 1: Спасибо, Сентябрь, за ваш ответ. Можете ли вы (или кто-либо еще) сказать мне, правильно ли я по этим 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 () возвращает NULL.

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

  4. Если ни один из Etags в $_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. В любой другой ситуации я обслуживаю свою страницу как обычно (я также -date 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 ; } 

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