Understand If-Modified-Since HTTP Header

2019-01-23 05:07发布

问题:

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

回答1:

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


回答2:

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.