2010-01-21 2 views
41

Что означает следующий заголовок HTTP 1.1?Что означает заголовок HTTP If-None-Match: *?

If-None-Match: *

Я понимаю, когда с помощью сильного или слабого ETag или даже список ETags, но я не understant его использование при использовании звезда (*) ,

Редактировать: Было бы неплохо иметь некоторый псевдокод (хороший код PHP), который покажет, как и на что ответить «If-None-Match: *».

ответ

36

Ответ: это зависит.

Предположим, что мы получили

If-None-Match: * 
If-Modified-Since: <yesterday date> 

И страница была изменена сегодня.

Прежде всего, мы рассмотрим *, в котором говорится: «Возвратите 304, если ресурс есть, и условие (2) выполнено». Хорошо, ресурс существует, НО условие (2) гласит: «Только возврат 304, если дата позже текущей». Таким образом, это условие не выполняется, и страница будет доставлена ​​полностью.

Если бы мы не получили If-Modified-Since, ответ был бы 304.

Если ресурс не существовало по запросу, мы вернули соответствующий код (как если бы не было If-None-Match).

304 должен быть возвращен только в ответ на запросы GET и HEAD, и все заголовки ответов, связанные с кешем, должны быть там. Для всех других типов запросов ваш сервер должен отвечать на 412 (предварительное условие не выполнено).

Надеюсь, это поможет;)

+0

Итак, когда у вас есть * в If-None-Match, единственный способ выдать 304 - это когда установлено значение «Имодей-Модифицировано-С»? – AlexV

+1

Либо это, либо без 'If-Modified-Since' вообще. Таким образом, есть два способа. –

10

Цитируя RFC 2616 (HTTP 1.1):

... если «*» даются и любой текущий объект существует для этого ресурса, то сервер не должен выполнить запрошенный метод, если не требуется, чтобы сделать это, потому что ресурс дата модификации не соответствует тому, который указан в поле заголовка If-Modified-Since в запросе.

RFC, продолжает говорить, что вместо того, чтобы выполнить запрос, серверы должны реагировать с 304 (не изменен) для GET и HEAD-запросов, и что они должны реагировать с 412 (предварительное условие не удалось) для всех других типов запросов , Но это только в том случае, если на сервере имеется некоторая версия запрашиваемого ресурса. Если у вас нет каких-либо объектов, то вы должны обрабатывать запрос (возможно, с 404, поскольку у вас ничего нет).

Чтобы обработать запрос, сначала выясните, что сделает сервер, если этот заголовок не был. Если результатом этого запроса будет не, то будет 2xx или 304, а затем выполните запрос как обычно. Но если результат запроса будет равен 2xx или 304, тогда обработайте случай If-None-Modified. Когда это звезда, то сразу же возвращайте 304 (если только она не сфабрикована If-Modified-Since). Если это один или несколько тегов сущностей, то проверьте, соответствует ли какой-либо из этих тегов тег вещи, которую вы планировали использовать в качестве ответа. Если есть совпадение, верните 304; если нет совпадения, тогда подавайте его, как обычно.

Позже в RFC, есть больше:

Значение «If-None-Match: *» является то, что метод НЕ ДОЛЖЕН быть выполнено, если представление, выбранное сервером происхождения (или по кеш, возможно, с использованием механизма Vary, см. раздел 14.44) существует и ДОЛЖЕН выполняться, если представление не существует. Эта функция предназначена для предотвращения гонок между операциями PUT.

То есть, звезда позволяет клиенту сказать, «Не PUT этот файл, если есть любой версия этого файла уже существует.»

+3

И что это означает на простом английском языке? Если * поставляется, я просто обслуживаю страницу (без 304)? Даже если If-Modified-Since поставляется ... – AlexV

Смежные вопросы