开发者

Understand If-Modified-Since HTTP Header

开发者 https://www.devze.com 2023-02-13 05:36 出处:网络
I am looking at a Caching library that is trying to use the If-Modified-Since header of a request object. The problem is this header never gets set, it is always blank which makes sense to me seeing h

I am looking at a Caching library that is trying to use the If-Modified-Since header of a request object. The problem is this header never gets set, it is always blank which makes sense to me seeing how it is a REQUEST.

How can you force a request to have a If-Modified-Since header? Or am I way off for 开发者_StackOverflowwhat this does.

Here is the function I am referring to.

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;
}


A request with If-Modified-Since only makes sense if the client already has a resource which is obtained along with a response that has a Last-Modified header in combination with headers which allow browser caching like a Cache-Control and/or Pragma value containing public.

Also, I've noticed that some browsers does not include If-Modified-Since when the original response also contained an ETag header. The browser will instead use If-None-Match to test it.

See also:

  • Caching tutorial for web authors and web masters


First you have to make sure the initial response is cached in the first place (I answered this in another, related question.

Try to set the following fields:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • Last-Modified is needed as a validator (do not send ETag if you want to test for If-Modified-Since)
  • Expires -1 tells that the resource is stale and must always be revalidated
  • Cache-Control must not include no-cache nor no-store

When you send these headers on the initial HTTP/200 response, on subsequent requests, the browser should send conditional requests that include the If-Modified-Since header.

0

精彩评论

暂无评论...
验证码 换一张
取 消