Toxic Elephant

Don't bury it in your back yard!

How to Get Apache and Typo Page Caching to Play Nice

Posted by matijs 13/12/2009 at 18h58

The Problem

You have been running a Typo blog [since 2005][since], but you still can’t quite get your Apache configuration right. In particular, you still get the occasional

Not found: http://www.matijs.net/blog/2005/07.html/24/from-bryar-to-typo

Note the weird 07.html part.

The Solution

This particular message turns up if you have turned the MultiViews option on: The file 07.html was cached earlier, and Apache finds it a good candidate for the 07 part of the URL. Of course it can’t find a subdirectory 24 inside that file! I personally consider this behavior extremely weird, but that doesn’t make it go away.

The solution is to turn off MultiViews and implement a poor man’s version that does no more than what’s needed.

# Turn off MultiViews
<Directory /var/www/www.matijs.net/public>
    Options FollowSymLinks -MultiViews
</Directory>

# Rewriting must be on
RewriteEngine on

# Implement simplistic MultiViews in the blog sub-uri
RewriteCond %{QUERY_STRING} "^$"
RewriteRule ^/blog/?$ /blog/index.html [QSA,L]
RewriteCond %{QUERY_STRING} "^$"
RewriteRule ^/blog([^.]+)/?$ /blog$1.html [QSA,L]

# Implement simplistic MultiViews elsewhere (static content)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^([^.]*)$ $1/index.html [QSA,L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]*)$ $1.html [QSA,L]

That ‘s it.

Some notes:

  1. The mapping to html files is implemented differently in the $/blog$ sub-uri than elsewhere. In the static part of the site, if there’s an URI /some/where, and and URI /some/where/else, this is stored on disk as /some/where/index.html and /some/where/else.html, respectively. In the blog part, Rails’ static caching system uses /some/where.html and /some/where/else.html.

  2. Turning on MultiViews for the static part of the site is not possible, since turning it off for the blog then does not seem to work. This may have something to do with the directory layout demanded by Passenger.

  3. It’s easy to get this wrong and cause Apache to never see the cached files. It’s also easy to get this wrong in other ways.

  4. The QSA part is probably not necessary. Call its presence a case of cargo-cult configuration.

  5. If your blog is not in the sub-URL blog you’ll have to change things, of course. Good luck.

Tags , , no comments no trackbacks

Comments

Comments are disabled