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:
-
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
. -
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.
-
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.
-
The
QSA
part is probably not necessary. Call its presence a case of cargo-cult configuration. -
If your blog is not in the sub-URL
blog
you’ll have to change things, of course. Good luck.