Understand If-Modified-Since HTTP Header

Mike picture Mike · Feb 22, 2011 · Viewed 38k times · Source

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

Answer

BalusC picture BalusC · Feb 22, 2011

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: