У меня вопрос о том, как ответить на HTTP 304 «Не изменено», когда я получаю оба if-none-match и if-modified-Since из запроса прокси / клиента.
Из раздела 14.26 RFC 2616 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):
Если ни один из тегов объекта не совпадает, то сервер МОЖЕТ выполнить запрошенный метод, как если бы поле заголовка If-None-Match не существовало, но ДОЛЖЕН также игнорировать любые поля заголовка If-Modified-Since в запросе. То есть, если ни один тег объекта не совпадает, сервер НЕ ДОЛЖЕН возвращать ответ 304 (Not Modified).
Я не уверен, что понимаю это утверждение ...
- «Если ни один из тегов объекта не совпадает» в PHP, говорят ли они о
$_SERVER['HTTP_IF_NONE_MATCH']
по сравнению с моими ETags, которые я отправил ранее? - Если я правильно понимаю это утверждение, как только ни один из ETag, перечисленных в
$_SERVER['HTTP_IF_NONE_MATCH']
, не соответствует моим ETags, я прекращаю все проверки и обслуживаю страницу в обычном режиме.
Кто-нибудь может перевести эту RFC-часть в псевдокод (или PHP-код) и / или ответить на мои 2 пункта выше?
РЕДАКТИРОВАТЬ 1: Спасибо, Святой Воланд, за ваш ответ. Можете ли вы (или кто-либо другой) сказать мне, прав ли я по этим 6 пунктам:
Формат
$_SERVER['HTTP_IF_NONE_MATCH']
может быть любым:a) Если-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
б) Если-None-Match: "xyzzy"
и НЕ:
c) Если-None-Match: "xyzzy, r2d2xxxx, c3piozzzz"
Если
!array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)
, anyTagMatched () возвращает NULL.Как только ETag в
$_SERVER['HTTP_IF_NONE_MATCH']
совпадает с ETag моего документа, anyTagMatched () возвращает TRUE.Если ни один из Etag в
$_SERVER['HTTP_IF_NONE_MATCH']
не соответствует моему документу ETag,anyTagMatched()
возвращает FALSE.Если
$_SERVER['HTTP_IF_MODIFIED_SINCE']
установлен и совпадает с датой "последнего изменения" моего документа,isExpired()
возвращает ЛОЖЬ, в противном случае - ИСТИНА.Как только
anyTagMatched()
возвращает TRUE, я выдаю 304. Если anyTagMatched () вернул NULL, аisExpired()
вернул FALSE, я могу выдать 304. В любой другой ситуации я обслуживаю свою страницу как обычно (я также выдаю последнюю версию Last- Заголовки Modified и ETag).