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

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

Если-None-Match: *

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

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


person AlexV    schedule 21.01.2010    source источник


Ответы (2)


Ответ: это зависит от обстоятельств.

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

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

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

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

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

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

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

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

person St.Woland    schedule 29.01.2010
comment
Итак, когда у вас есть * в If-None-Match, единственный способ выдать 304 - это когда установлен If-Modified-Since и соответствует? - person AlexV; 01.02.2010
comment
Либо так, либо вообще без If-Modified-Since. Итак, есть 2 пути. - person St.Woland; 02.02.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.

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

person Rob Kennedy    schedule 21.01.2010
comment
А что это значит на простом английском? Если указан *, я просто обслуживаю страницу в обычном режиме (без 304)? Даже если поставляется If-Modified-Since ... - person AlexV; 21.01.2010