Synopsis
This is rather old code, but saved my bacon more than once.Runs under Apache with Mod_Perl, and corrects the URI requested when it is giving lazily. Thus a request for “/INDEX.HTML” is rewritten to “/index.html” as appropriate.
Code
=head1 NAME
M::Apache::fixcase - Want to fix case, showing the user the error of their ways?
=head1 SYNOPSIS
PerlModule M::Apache::fixcase
<VirtualHost>
PerlTransHandler M::Apache::fixcase
</VirtualHost>
=cut
package M::Apache::fixcase;
use Apache2::Const qw(DECLINED);
use Apache2::RequestUtil ();
sub handler {
       my $r = shift;
       my $file=$r->document_root() . $r->uri();
       unless(-e $file) {
               # File doesn't exist, let's try to find it!
               my @uribits=split(/\//,$r->uri());
               shift @uribits; # shift off the beginning ''
               my $newuri=$r->document_root(); # $newuri is the uri we're building
               my $sofar=0;
               foreach my $bit (@uribits) {
                       $bit =~ s/\(|\)|\`//g; # stupid url tricks
                       $sofar=0; # reset sofar, so we know if we're still on track
                       opendir(FD,$newuri) or last;
                       foreach my $dthing (readdir(FD)) {
                               if($dthing =~ /^\./) { next; } # safety first;
                               if($dthing =~ /^$bit$/i) { # case-insenstive pattern match
                                       # We have a match!
                                       $sofar=1;
                                       $newuri .= "/" . $dthing;
                                       last;
                               }
                       }
                       closedir(FD);
                       unless($sofar) { last; } # we missed this bit, don't bother recursing further
               }
               if($sofar) {
                       # We made it!
                       my $dr=$r->document_root();
                       $newuri =~ s/^$dr//; # strip off the document_root from the new uri
                       $r->uri($newuri); # Set the uri to the new uri
               } # else we can't do anything...
       }
       return DECLINED; # Always pass it on
}
1;