This guide is to help users who were previously on a case insensitive web server and hosting many directories and files on their server mixed with upper and lower case letters who wish to move to a server that has case sensitivity such as Linux, or more specifically Ubuntu running Apache.

In this scenario, the Ubuntu Apache server is also running a Multi-site WordPress, running multiple domains on the same server so the traditional ways of configuring the vhosts file may not possible.

The trick is to set up a rewrite rule that essentially takes any URL provided to the server, and interprets it as a lowercase URL.

This seems pointless at first, but the trick is that the files being migrated to the Multi-site WordPress server, can be copied in just lower case form.

I found the easiest trick is to simply zip up all of the files, and then unzip them.

zip -0 -r foo/
unzip -LL

This will zip up the foo directory (including the directory itself) that contains all of the files and folders, and then UNZIP it all using the -LL flag which makes it all lowercased folders and files.

You can then perform the command:

cp -r /foo/* /var/www/html

to move the contents of everything that was inside the foo folder, directly into the html folder.

This will take care of having a migrated set of data that’s strictly in lower cased form.

The next step is to have Apache actually reference the lower case version each time a request is made.

For that we’ll need to sure mod_rewrite is enabled if it’s not already by running:

sudo a2enmod rewrite
sudo service apache2 restart

Next, we’ll need to edit the global apache2 conf file

sudo nano /etc/apache2/apache2.conf

At the bottom of the file include the lines:

RewriteEngine On
RewriteMap  lc int:tolower

Next, we’ll need to edit the .htaccess file used by WordPress

This should be found in the root of our webserver directory that WordPress is hosted on.

sudo nano /var/www/html/.htaccess

At the top of the file under the Options -Index (if it exists as the first line)

Place the lines of:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]

The RewriteCond will check if any characters in the URL contain a capital letter.

If there is a capital letter found, it will run the function lc (defined in the apache2.conf file) that will convert the string $1, which is the regex group defined by (.*)  which is the whole URL in this case, to a lower case string.

It will then perform a redirect 301, and the L will indicate that this the LAST thing involved with this RewriteCond and RewriteRule set.