When I set up my wordpress blog yesterday I wanted to use search engine friendly URLs which wordpress usually supports by the use of Apache’s mod_rewrite. Unfortunately my hoster doesn’t support .htaccess files in the small web package I currently purchased, which I found rather disappointing. Generally, there might by a couple of reasons why the default way of rewriting URLs might not work: Your hoster disabled .htaccess files (AllowOverride None), mod_rewrite is not loaded oder not available on the server or your site runs on IIS which naturally doesn’t Apache’s rewriting. Luckily there are two ways around this limitation that are supported by WordPress out of the box.
The first way that is suggested in the Using Permalinks Section of the WordPress Codex is by using URLs like index.php/some/path/. All you have to do is specifing the custom permalink structure in Options>Permalinks. Apparently this type of permalinks without the use of mod_rewrite worked in WordPress at least since v1.2 but for me, the ugly index.php/ path isn’t something I want to have permanently in my URLs. I favour the following sollution.
You can set your index.php of WordPress as the 404 error page for your website. This has the effect that WordPress is called for all your virtual URLs which do not exisit as actual files on the webserver. I’ve tested this with version 2.0 and so far it works pretty well. There may be problems with HTTP POST operations according to experiments with the textpattern weblog. If it turns out to work properly it should be added to the WordPress documentation since it produces the same clean URLs as mod_rewrite with the bitter aftertaste of being an ugly hack though.
Internally both methods rely on index.php to analyze the URL. Actually in WordPress v2.0 this has become the default way of URL rewriting any way. If you’d have a look at a .htaccess file of a WordPress v1.5 installation you’ll see about 30 rules for all the different URLs (search/, category/, author/, …). In WordPress v2.0 the .htaccess looks much cleaner: all requests are forwarded to index.php – pretty much the same way a redirection of the 404 error page would do it.