HTTP If-None-Match против If-Match - PullRequest
       17

HTTP If-None-Match против If-Match

24 голосов
/ 28 января 2010

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

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

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

  • If-Modified-Since
  • If-None-Match

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

  • If-Match
  • If-Unmodified-С
  • If-Range

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

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

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

1 Ответ

37 голосов
/ 28 января 2010

If-Match

Сервер ДОЛЖЕН вернуть ответ 412 (Precondition Failed), если:

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

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

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

Вывод по if-match :

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

If-Match в RFC2616

If-Unmodified-С

Сервер ДОЛЖЕН вернуть ответ 412 (Precondition Failed), если:

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

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

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

If-Unmodified-Since в RFC2616

If-Range

Неофициально, его значение таково: «если сущность не изменилась, пришлите мне часть (и), которую я пропускаю; в противном случае отправьте мне всю новую сущность '

Условия:

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

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

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)
...