Понять if-Modified-Since HTTP Header
Я просматриваю библиотеку кэширования, которая пытается использовать заголовок 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;
}
Ответы
Ответ 1
Запрос с If-Modified-Since
имеет смысл, если клиент уже имеет ресурс, который получается вместе с ответом, который имеет Last-Modified
в сочетании с заголовками, которые позволяют кэшировать браузер, например Cache-Control
и/или Pragma
, содержащее public
.
Кроме того, я заметил, что некоторые браузеры не включают If-Modified-Since
, когда исходный ответ также содержал заголовок ETag
. Вместо этого браузер будет использовать If-None-Match
, чтобы проверить его.
См. также:
Ответ 2
Сначала вы должны убедиться, что исходный ответ был кэширован в первую очередь (I ответил в другом связанном с ним вопросе.
Попробуйте установить следующие поля:
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
.