Blog Software and HTTP Caching
Published July 2nd, 2005
I took a look at 7 different weblog engines this afternoon:
The only criteria I used to compare them is the HTTP Headers they sent for the Front Page and RSS Feed. My theory is that if a blog sends the correct HTTP headers, the coders behind it might have a clue, and it might therefore be better overall software. Kudos to OpenSourceCMS.com for having Demo sites running for most of the projects.
My rating scale is wrong, unacceptable, acceptable and good. From worst to best:
Blog::CMS
Rating: WRONG
Lets start with the front page:
Quote from Front Page HTTP Headers:
Generator: BLOG:CMS v3.6.4
Set-Cookie: lastVisit=deleted; expires=Fri, 02-Jul-04 03:37:19 GMT; path=/
Generator? huh? Thats not a valid HTTP Header. Yes, you can legally add your own headers, but if you are just making them up, you are supposed to prefix it with ‘X-’, eg ‘X-Generator’.
Next, they did not send any Cache-Control or Vary Headers. But, they vary the content based on the content of cookies. This is wrong, and will cause proxies and clients to incorrectly cache pages.
The RSS Feed is a little better:
Quote from RSS HTTP Headers:
Pragma: no-cache
Generator: BLOG:CMS v3.6.4
Set-Cookie: lastVisit=deleted; expires=Fri, 02-Jul-04 03:38:21 GMT; path=/
Etag: “503728b580b9894b6aa72317f138cee5”
The inclusion of an ETag is helpful, but they still send Generator and a Set-Cookie. The use of the deprecated Pragma header is sad.
b2evolution
Rating: WRONG
b2evolution doesn’t send any headers related to HTTP Caching for the Front Page or RSS Feed. No ETags, no Last-Modified, No Cookies, nothig, nada. Come on people, this is 2005, not 1997.
bBlog
Rating: Unacceptable
bBlog does send extra headers, but it sends them attempting to kill all caching on the Front Page
Quote from Front Page HTTP Headers:
Set-Cookie: PHPSESSID=f898e7316af0cd0f4b5e4bcfdc484523; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Sending an Expires in the extreme past, and forcing all caches to not-cache is lame. No, I am serious, really really really lame. HTTP Caching is good, don’t try to kill it in all cases, when your frontpage can easily be cached.
Looking at the RSS Feed, it is nearly the same story:
Quote from RSS HTTP Headers:
Set-Cookie: PHPSESSID=2978e587e092faa2cd705d7266f3636d; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Thu, 02 Jun 2005 23:46:28 GMT
Etag: ae0a20e9f8140a969c320eb582b62e4b
They do correctly add a Last-Modified and Etag, but they still are trying to bust the cache.
Serendipity
Rating: Unacceptable
Similiar to bBlog, Serendipity’s front page does cache busting:
Quote from Front Page HTTP Headers:
Set-Cookie: PHPSESSID=d6c0446768d6cf4a0aa7c88d6eaba242; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Ugh. I guess no one really wants the help of HTTP Caching?
At leas the RSS Feed is slightly better:
Quote from RSS HTTP Headers:
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Fri, 01 Jul 2005 18:31:42 GMT
ETag: “Fri, 01 Jul 2005 18:31:42 GMT”
Okay, Last-Modified, and an ETag, but still sending the Cache Busting stuff.
Typo
Rating: Almost Acceptable
Typo is the only Ruby on Rails application I tried, but the front page isn’t very good:
Quote from Front Page HTTP Headers:
Set-Cookie: sessionid=afd0a26b1f95c042e65e34bf2a598a54; path=/
Cache-Control: no-cache
Cache Busting. Who has been talking to these Application Developers?
However, the RSS Feed is acceptable:
Quote from RSS HTTP Headers:
Last-Modified: Sat, 02 Jul 2005 03:20:05 GMT
ETag: “1610900121”
Last-Modified and an ETag. No cookies. Pretty good.
WordPress
Rating: Acceptable
Our first Acceptable entry does not send any related headers on the Front Page, but the RSS Feed is good:
Quote from RSS HTTP Headers:
Last-Modified: Sat, 02 Jul 2005 03:26:14 GMT
ETag: “29f855045e1d4a849c76c24bd8d2406d”
No Cache Busting, and setup to work with Conditional Gets.
TextPattern
Rating: Acceptable
Like WordPress, TextPattern didn’t send any headers for the Front Page, but the RSS Feed does a perfect job:
Quote from RSS HTTP Headers:
Last-Modified: Mon, 02 May 2005 04:13:50 GMT
Expires: Sat, 02 Jul 2005 04:42:45 GMT
ETag: “28AD8AFA-904DDC92”
Woohoo. Last-Modified, Expires, and an ETag. Could use a Cache-Control for more specific policies, and I only downgraded it because of nothing sent on the Front Page.
Conclusion
At least a few proejcts get it right for the RSS Feed, but none of them are correct for the Front Page. I was really disappointed with these results. I had faith that more people understood HTTP Caching. Is there better software out there? Have other web developers given up on HTTP Caching?
Update: Formating Fixes
Update 2: Typo Fixes.
Written by Paul Querna, CTO @ ScaleFT. @pquerna