obj.cacheable vs expires headers?

Luc Stroobant lstroobant at gmail.com
Mon Feb 1 21:42:58 CET 2010

Hello list,

I have a vcl-config with a snippet like the one on:

sub vcl_fetch {
     if (obj.cacheable) {
       unset obj.http.expires;
       set obj.http.cache-control = "max-age = 900";
       set obj.ttl = 2w;
       set obj.http.magicmarker = "1";

sub vcl_deliver {
     if (resp.http.magicmarker) {
       /* unset marker and serve it for upstream as new */
       unset resp.http.magicmarker;
       set resp.http.age = "0";

We used that in an attempt to override the expires headers from static 
files for a site and keep them in Varnish cache. We don't want to cache 
an dynamic (PHP) page.

At first sight, everything went fine. But once the load rised a bit, we 
noticed that dynamic pages are sometimes cached.
I've been checking the headers and it looks like the expires header for 
dynamic pages is also removed. I don't think the headers from the 
(first) request below should be considerd obj.cacheable  according to 
the definition on http://varnish-cache.org/wiki/VCL
Or did I miss something? Is this a mistake in my config or a possible 
Varnish issue?

Test without the vcl snippet.
PHP page: unmodified headers and not cached, as expected:

HTTP/1.1 200 OK
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.2.12
Set-Cookie: SESSbc5f9ce1c97eee1824d1ab6sdfsdfssf70k2hqq7mgo6; 
expires=Wed, 24-Feb-2010 22:58:21 GMT; path=/; domain=removed
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Mon, 01 Feb 2010 19:25:01 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Content-Type: text/html; charset=utf-8
Content-Length: 56194
Date: Mon, 01 Feb 2010 19:25:02 GMT
X-Varnish: 963899298
Age: 0
Via: 1.1 varnish
Connection: close

With the config:
PHP page, Expires header removed and cache-control is set

HTTP/1.1 200 OK
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.2.12
Set-Cookie: SESSbc5f9ce1c97eee1824d1ab670ce3057b=91dpgvghvkmonso1; 
expires=Wed, 24-Feb-2010 23:21:04 GMT; path=/; domain=removed
Last-Modified: Mon, 01 Feb 2010 19:47:44 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 59418
cache-control: max-age = 900
Date: Mon, 01 Feb 2010 19:47:48 GMT
X-Varnish: 1790685114
Via: 1.1 varnish
Connection: close
age: 0

I used the same VCL-code in vcl_fetch for both examples and for static 
files, everything works as expected. Any ideas?
(Running on Varnish 2.0.6)


sub vcl_recv {

     # Add a unique header containing the client address
     remove req.http.X-Forwarded-For;
     set    req.http.X-Forwarded-For = client.ip;

     /* Don't cache accept */
     if (req.http.host ~ "^some.host$") {
       return (pass);

     if (req.url ~ "\.(css|js|jpg|jpeg|gif|ico|png)$") {
     	unset req.http.cookie;

    /* Never cache php files... */
    if (req.url ~ ".*\.php") {
      return (pass);

    /* ... or Apache server status */
    if (req.url ~ ".*/server-status$") {
      return (pass);

More information about the varnish-misc mailing list