Transitioning from a case-insensitive to a case-sensitive server

Converting sites that have been hosted on a Windows server is often frustrating, as IIS allows files to be accessed with any case in their filename. Here’s a simple solution for a site made of static files, using PHP and an Apache 404 handler:

In 404-case-insensitive.php

<?php

/* Copyright 2010 The Internet Company LLC
 *
 * May be copied under the terms of the MIT software license.
 */

	$directory = dirname($_SERVER['REQUEST_URI']);
	$base = basename($_SERVER['REQUEST_URI']);
	if($directory == '/') $directory = '';

	$potential = glob($_SERVER['DOCUMENT_ROOT'].$directory."/*");

	foreach($potential as $e) {
		$e = basename($e);
		if(strtolower($e) == strtolower($base)) {
			header("Location: $directory/$e");
			exit(0);
		}
	}

	Header("HTTP/1.1 404 File Not Found");
	echo("Page not found.");

?>

And in .htaccess

ErrorDocument 404 /404-case-insensitive.php