Thanks a lot. I test all of your suggestions and found that setting :expires to any value does NOT work. However, using :max-age works as expected.
I read this at http://www.mnot.net/blog/2007/05/15/expires_max-age
"CC: max-age is just a straight integer number of seconds, while Expires
has a somewhat complex date format. From what I’ve seen in various
implementations, this makes a difference; even small errors in
generating the Expires value (e.g., omitting the leading ‘0’ from the
hour) can cause downstream caches to misinterpret it. It happens more
often than you think.
Compounding these errors are the caches themselves; in testing a variety
of commercial and open source implementations, I found that a large
number flout this requirement;
HTTP/1.1 clients and caches MUST treat other invalid date formats,
especially including the value “0”, as in the past (i.e., “already
So I suspect there may be a bug in ring or noir related to this, I am guessing ring. Perhaps the handling of JodaTime objects in ring has a bug somewhere.
I am going to stick with :max-age for now :)