Мой вопрос в том, как ответить 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 (не модифицированный).
Я не уверен, чтобы понять это заявление …
$_SERVER['HTTP_IF_NONE_MATCH']
против моих ETags, которые я отправил ранее? $_SERVER['HTTP_IF_NONE_MATCH']
соответствует моим ETags, я останавливаю все проверки и обычно обслуживаю страницу. Любой может перевести эту часть RFC в псевдокод (или код PHP) и / или ответить на мои 2 балла выше?
РЕДАКТИРОВАТЬ 1: Спасибо, Сентябрь, за ваш ответ. Можете ли вы (или кто-либо еще) сказать мне, правильно ли я по этим 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 () возвращает NULL.
Как только ETag в $_SERVER['HTTP_IF_NONE_MATCH']
соответствует моему документу ETag, anyTagMatched () возвращает TRUE.
Если ни один из Etags в $_SERVER['HTTP_IF_NONE_MATCH']
не соответствует моему документу ETag, anyTagMatched()
возвращает FALSE.
Если $_SERVER['HTTP_IF_MODIFIED_SINCE']
установлен и соответствует моему документу, «последний измененный» дата isExpired()
возвращает FALSE, в противном случае возвращает TRUE.
Как только 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 ; }
Главный ответ здесь .