Понимать заголовки HTTP Etags - PullRequest
       33

Понимать заголовки HTTP Etags

0 голосов
/ 22 февраля 2011

Я использую библиотеку кэширования с функцией, показанной ниже. Он пытается получить электронные теги из запроса на 5-й строке, но электронные теги никогда не устанавливаются.

Когда в REQUEST появятся eTags? и как вы могли бы установить их?

Спасибо.

public function isNotModified(Request $request)
{
    $lastModified = $request->headers->get('If-Modified-Since');

    $notModified = false;
    if ($etags = $request->getEtags()) {
        $notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);
    } elseif ($lastModified) {
        $notModified = $lastModified == $this->headers->get('Last-Modified');
    }

    if ($notModified) {
        $this->setNotModified();
    }

    return $notModified;
}

1 Ответ

2 голосов
/ 22 февраля 2011

Поле заголовка ETag только для ответов:

Поле заголовка ответа ETag предоставляет текущее значение тега объекта для запрошенного варианта.

Но методом getEtags могут быть теги из поля заголовка If-None-Match :

Если какой-либо из тегов объекта соответствует тегу объекта, который был бы возвращен в ответе на аналогичный запрос GET (без заголовка If-None-Match ) для этого ресурса, или если задано «*» и для этого ресурса существует какой-либо текущий объект, то сервер НЕ ДОЛЖЕН выполнять запрошенный метод, если только это не требуется, поскольку дата модификации ресурса не совпадает с той, которая указана в If-Modified -Так как поле заголовка в запросе. Вместо этого, если метод запроса был GET или HEAD, сервер ДОЛЖЕН ответить 304 (не измененным) ответом, включая поля заголовка, связанные с кэшем (в частности, ETag ) одного из соответствующих объектов. Для всех других методов запроса сервер ДОЛЖЕН ответить со статусом 412 (предварительное условие не выполнено).

Это, кажется, точно соответствует данному коду (я переставил первое предложение, чтобы соответствовать коду):

//   the server MUST NOT perform the requested method
$notModified = (
    //   if any of the entity tags match the entity tag of the entity that
    //   would have been returned in the response to a similar GET request
    //   (without the If-None-Match header) on that resource
    in_array($this->getEtag(), $etags)
    //   or if "*" is given and any current entity exists for that resource
    || in_array('*', $etags))
    //   unless required to do so because the resource's modification
    //   date fails to match that supplied in an If-Modified-Since header
    //   field in the request.
    && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);

Последнее выражение (!$lastModified || $this->headers->get('Last-Modified') == $lastModified) эквивалентно !($lastModified && $this->headers->get('Last-Modified') != $lastModified), которое лучше соответствует последней части предложения.

...