Подтвердить что ты не робот

Что означает заголовок HTTP If-None-Match: *?

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

Если-Нет-Матч: *

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Я надеюсь, что это поможет;)

Ответ 2

Цитата из RFC 2616 (HTTP 1.1):

... если задано "*", и любой существующий объект существует для этого ресурса, тогда сервер НЕ ДОЛЖЕН выполнять запрошенный метод, если только это не требуется, потому что дата изменения ресурса не соответствует тому, что предоставляется в If- Изменено-В поле заголовка запроса.

Далее 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.

То есть, звезда позволяет клиенту сказать: "Не используйте этот файл, если там есть какая-либо версия этого файла".