Что означает HTTP-заголовок If-None-Match: *? - PullRequest
46 голосов
/ 21 января 2010

Что означает следующий заголовок HTTP 1.1?

If-None-Match: *

Я понимаю это при использовании сильного или слабого ETag или дажесписок ETag, но я не понимаю, что он используется при использовании star (*).

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

Ответы [ 2 ]

40 голосов
/ 29 января 2010

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

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

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

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

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

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

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

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

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

11 голосов
/ 21 января 2010

Цитирование из 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.

То есть, звезда позволяет клиенту сказать: «НЕ ЗАДЕРЖИВАЙТЕ этот файл, если существует любая версия этого файла».

...