HTTP If-None-Match vs. If-Match

В настоящее время я создаю сценарий PHP, который при необходимости будет отвечать HTTP «304 Not Modified».

(См. вопрос № 2086712 за то, что я делаю до сих пор).

В настоящее время я отвечаю на следующие вопросы:

  • If-Modified-Since
  • Если-нет-совпадение

Но я обнаружил, что еще 3 заголовка могут запускать «условный GET» (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3):

  • Если совпадение
  • Если-Неизмененный-С
  • Если-диапазон

Последние 2 кажутся неуместными для моей системы кэширования (они, кажется, используются при возобновлении "больших" загрузок), но я не нашел, может ли "If-Match" быть полезным в моей системе.

Используется ли «If-Match» в прокси-серверах или веб-браузере для «обычного» содержимого страницы? Чем "If-Match" отличается от "If-None-Match"?

Стоит ли мне поддерживать этих троих или только некоторых из них? Любая помощь приветствуется!


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


Ответы (1)


Если совпадение

Сервер ДОЛЖЕН вернуть ответ 412 (Ошибка предварительного условия), если:

  • ни один из тегов объекта не совпадает,
  • или дается *, а текущий объект не существует

If-Match следует игнорировать, если:

  • любой из тегов объекта соответствует
  • или если запрос приводит к чему-либо, кроме статуса 2xx или 412 (без If-Match)
  • или если указан * и для ресурса существует какая-либо текущая сущность

Заключение по if-match:

  • Значение If-Match: * заключается в том, что метод должен выполняться, если представление, выбранное исходным сервером ... существует, и не должен выполняться, если представление не существует.

If-Match в RFC2616

Если-Неизмененный-С

Сервер ДОЛЖЕН вернуть ответ 412 (Ошибка предварительного условия), если:

  • запрошенный вариант был изменен с указанного времени

If-Unmodified-Since следует игнорировать, если

  • запрошенный ресурс не был изменен с момента, указанного в этом поле
  • или запрос в обычном режиме (то есть без заголовка If-Unmodified-Since) приведет к чему-либо, кроме статуса 2xx или 412
  • или указанная дата недействительна

If-Unmodified-Since в RFC2616

Если-Диапазон

Неформально это означает «если объект не изменился, пришлите мне часть (части), которые мне не хватает; в противном случае пришлите мне всю новую сущность '

Предпосылки:

  • Заголовок If-Range ДОЛЖЕН использоваться только вместе с заголовком Range и ДОЛЖЕН игнорироваться, если запрос не включает заголовок Range, или если сервер не поддерживает операцию поддиапазона.

Серверу СЛЕДУЕТ предоставить ответ 206 (частичное содержимое), если заголовок If-Range совпадает с текущим тегом объекта для объекта. В противном случае серверу СЛЕДУЕТ вернуть весь объект, используя ответ 200 (OK).

If-Range в RFC2616

Неопределенные результаты

Следующая комбинация заголовков приводит к неопределенному результату:

  • If-Modified-Since и If-Match
  • If-Modified-Since и If-Unmodified-Since
  • If-None-Match и If-Match
  • If-None-Match и If-Unmodified-Since

Эти правила были разложены на следующие (их можно найти в RFC2616 ):

  • If-Match и (If-None-Match или If-Modified-Since)
  • If-Modified-Since и (If-Match или If-Unmodified-Since)
  • If-None-Match и (If-Match или If-Unmodified-Since)
  • If-Unmodified-Since и (If-None-Match или If-Modified-Since)
person St.Woland    schedule 28.01.2010
comment
Есть ли ситуация, когда If-Match, If-Unmodified-Since или If-Range могут вызвать ответ HTTP 304 Not Modified? - person AlexV; 28.01.2010
comment
Нет, это разрешено только для If-None-Match и If-Modified-Since. en.wikipedia.org/wiki/List_of_HTTP_headers - person St.Woland; 28.01.2010
comment
Разве это не If-Match: * конфликтует с 404? - person Vicary; 24.01.2013
comment
Отвечая на мой собственный вопрос, If-Match имеет условие, которое делает себя последней цепочкой разрешений, поэтому 404 обычно имеет приоритет. - person Vicary; 24.01.2013