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

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

If-None-Match:*

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

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

2 ответов


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

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

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

и страница была изменена .

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

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

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

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

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


цитирую RFC 2616 (HTTP 1.1):

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

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

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

позже в RFC, есть еще:

значение " If-None-Match: *" заключается в том, что метод не должен выполняться, если представление выбрано исходным сервером (или кэшем, возможно, с помощью механизма Vary, см. раздел 14.44) существует и должно выполняться, если представление не существует. Эта функция предназначена для предотвращения гонок между операциями PUT.

то есть, star позволяет клиенту сказать: "не помещайте этот файл, если есть любой версия этого файла уже нет."