Мой вопрос о том, как ответить 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 (Не Измененный) ответ.
Я не, несомненно, пойму этот оператор...
$_SERVER['HTTP_IF_NONE_MATCH']
по сравнению с моими Завершающими тегами, которые я отправил ранее?$_SERVER['HTTP_IF_NONE_MATCH']
соответствуйте моим Завершающим тегам, я останавливаю все проверки и обычно служу странице. Кто-либо может перевести эту часть RFC в псевдокоде (или коде PHP) и/или ответить на мои 2 точки выше?
РЕДАКТИРОВАНИЕ 1: Thank you St. Woland для Вашего ответа. Можете Вы (или кто-либо еще) говорите мне, если я корректен на этих 6 точках:
Формат $_SERVER['HTTP_IF_NONE_MATCH']
может быть также:
a) If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
b) If-None-Match: "xyzzy"
и НЕТ:
c) If-None-Match: "xyzzy, r2d2xxxx, c3piozzzz"
Если !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)
, anyTagMatched () возвращает ПУСТОЙ УКАЗАТЕЛЬ.
Как только Завершающий тег в $_SERVER['HTTP_IF_NONE_MATCH']
соответствуйте моему документу Завершающий тег, anyTagMatched () возвращает TRUE.
Если ни один из Завершающих тегов в $_SERVER['HTTP_IF_NONE_MATCH']
соответствуют моему документу Завершающий тег, anyTagMatched()
возвращает FALSE.
Если $_SERVER['HTTP_IF_MODIFIED_SINCE']
установлен и соответствует моему документу, "в последний раз изменил" дату isExpired()
возвращает FALSE, иначе возвратите TRUE.
Как только anyTagMatched()
возвраты ПРАВДА, я выпускаю 304. Если anyTagMatched () возвратил ПУСТОЙ УКАЗАТЕЛЬ и isExpired()
возвращенный FALSE я могу выпустить 304. В любой другой ситуации я служу своей странице в качестве нормальной (я также выпускаю Измененное в последний раз актуальное и заголовки Завершающего тега).
Это должно быть помещено в конце (перемещено для лучшего взгляда).
$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 ;
}
Главный ответ здесь .