Wishful Coding

Didn't you ever wish your
computer understood you?

Wordpress MU in Resin with Quercus

While researching Quercus today, I ran into some trouble running the new integrated Multi Site feature of Wordpress 3.0(previously a separate project known as Wordpress MU or WPMU for short) on Resin. Quercus is a PHP implementation written in Java that runs on any Java Servlet Container, including but not limited to Jetty, Tomcat or Resin. I took Resin for it was the easiest to setup and includes Quercus. Normally one would just use Apache and mod_php, but I also want to run Jython and Clojure projects, so I'm looking for a solution to combine these. Wordpress MU allows me to run multiple blogs on a single installation(as seen on wordpress.com), which I want to use for hosting websites for my clients. The problem with WPMU is that to map the different urls to one installation, some tricky mod_rewrite code is required for Apache, but since I'm using Resin here, I'll have to find another solution. There is a post on the Quercus wiki describing the process of setting up a Multi Site Wordpress installation, but this is for an old version of WPMU(before the merge) and an old version of Resin. After a good few hours of trying, I got it working with the latest version of Wordpress 3.0, Quercus 4.0.3 and Resin 4.0.7. Just follow the wiki, except for a few points:
<?xml version="1.0"?>
<web-app xmlns="http://caucho.com/ns/resin" xmlns:resin="urn:java:com.caucho.resin">
	<resin:Forward regexp="^/index\.php$" target="/"/>
	<resin:Dispatch regexp="^">
		<resin:IfFileExists/>
	</resin:Dispatch>
	<resin:Redirect regexp="^(/[_0-9a-zA-Z-]+/)?wp-admin$" target="$1wp-admin/"/>
	<resin:Forward regexp="^(/[_0-9a-zA-Z-]+/)?files/(.+)" target="/wp-includes/ms-files.php?file=$2"/>
	<resin:Forward regexp="^(/[_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*)" target="/$2"/>
	<resin:Forward regexp="^(/[_0-9a-zA-Z-]+/)?(.*\.php)$" target="/$2"/>
	<resin:Forward regexp="/.*" target="/index.php"/>
</web-app>
Note that I did not use the pro version, skipped the DNS stuff by using directory instead of subdomains in WP, I also skipped the chown stuff by removing this block from resin.xml:
<resin:if test="${resin.userName == 'root'}">
        <user-name>pepijndevos</user-name>
        <group-name>staff</group-name>
      </resin:if>