Я просматриваю библиотеку кэширования, которая пытается использовать заголовок If-Modified-Since
объекта запроса. Проблема в том, что этот заголовок никогда не устанавливается, он всегда пуст, и мне кажется, что это ЗАПРОС.
Как вы можете заставить запрос иметь заголовок If-Modified-Since
? Или я ухожу за тем, что это делает.
Вот функция, о которой я говорю.
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; }
Запрос с If-Modified-Since
имеет смысл только в том случае, если клиент уже имеет ресурс, который получается вместе с ответом с заголовком Last-Modified
в сочетании с заголовками, которые позволяют кэшировать браузер, например, Cache-Control
и / или значение Pragma
содержащей public
.
Кроме того, я заметил, что некоторые браузеры не включают If-Modified-Since
когда исходный ответ также содержал заголовок ETag
. Вместо этого браузер будет использовать If-None-Match
для ее проверки.
Сначала вы должны убедиться, что исходный ответ был кэширован в первую очередь (я ответил на это в другом связанном вопросе.
Попробуйте установить следующие поля:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT Expires: -1 Cache-Control: must-revalidate, private
Last-Modified
необходим как валидатор (не отправляйте ETag
если вы хотите протестировать If-Modified-Since
) Expires -1
говорит, что ресурс устарел и всегда должен быть проверен Cache-Control
не должен включать no-cache или no-store Когда вы отправляете эти заголовки на исходный ответ HTTP/200
, при последующих запросах браузер должен отправлять условные запросы, содержащие заголовок If-Modified-Since
.