6

How can I modify my .htaccess file on Apache to do the following:

"If the URL ends in .aspx, rewrite the entire URL to lowercase."

Backstory: I recently migrated a website from ASPX hosting to Linux/Apache hosting. There are some old URLs in the wild (marketing materials), and I need to make sure that those URLs still work; Windows web servers are not case-sensitive but Linux web servers are.

Thanks in advance.

DWRoelands
  • 4,878
  • 4
  • 29
  • 42
  • 1
    http://www.askapache.com/htaccess/rewrite-uppercase-lowercase.html i case you don't have access to Aapche server config (shared access) – anubhava Mar 05 '14 at 19:08
  • This seems to be very close to what I need, but doesn't seem to offer guidance on how to make the rewrite conditional on the presence of ".aspx" in the URL. – DWRoelands Mar 05 '14 at 19:17
  • ok posted an answer below. – anubhava Mar 05 '14 at 19:50

3 Answers3

5

You need to define a rewrite map which can only be done in server/vhost config files, not in htaccess files. You'll need to add something like:

RewriteMap lc int:tolower

Then in your htaccess file, you can create a rule like:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^(.*\.aspx)$ ${lc:$1} [L,NC]

This will check that there are capital letters in the URI, then apply the map which turns everything into lowercase letters.

Jon Lin
  • 142,182
  • 29
  • 220
  • 220
  • I should have been more specific - I am on a shared hosting environment. My apologies. So, no way to do it through .htaccess alone? – DWRoelands Mar 05 '14 at 19:15
  • The problem which I am facing when using this code is that in my web app I have used name of some css ,js, images in caps .so what it does that it makes the requested files name to small and they are not rendering . Do u have any clue what should I do – thedudecodes Sep 24 '16 at 11:38
4

If you are not on a shared hosting environment and happy to enter the rules directly into your Apache configuration you can use mod_rewrites RewriteMap directive to do the lowercase conversion:

RewriteMap lc int:tolower
RewriteRule (.*?[A-Z]+.*) ${lc:$1} [R]

For more information on this see the Apache manual: Redirect a URI to an all-lowercase version of itself. Although it is noted there that it is recommended to use mod_speling instead of this rewrite rule.

with Apache rewrite and PHP: Taken from here

.htaccess

RewriteEngine on
RewriteBase /

# force url to lowercase if upper case is found
RewriteCond %{REQUEST_URI} [A-Z]
# ensure it is not a file on the drive first
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

rewrite-strtolower.php

<?php
if(isset($_GET['rewrite-strtolower-url'])) {
    $url = $_GET['rewrite-strtolower-url'];
    unset($_GET['rewrite-strtolower-url']);        
    $params = strtolower(http_build_query($_GET));
    if(strlen($params)) {
        $params = '?' . $params;
    }
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
    exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');

Setup up the rewrite module
Check if the incoming URL contains any uppercase letters
Ensure that the incoming URL does not refer to a file on disk (you may want to host a file with upper case letters in its name - something like a PDF file that a client has uploaded through the CMS you have supplied them for instance)
Send all the requests that match aforementioned rules are then rewritten to our script that will do the actual conversion to lowercase work.
The only thing to note here is the QSA modifier, which makes sure all the GET "variables" are passed onto the script

Next up is the little snippet of PHP that does all the work!
This is a file called rewrite-strtolower.php in the same directory as your .htaccess file mentioned above.

Community
  • 1
  • 1
shahab
  • 41
  • 3
  • I should have been more specific - I am on a shared hosting environment. My apologies. So, no way to do it through .htaccess alone? – DWRoelands Mar 05 '14 at 19:16
  • yes,it is possible, but my code in php,you need simply convert to asp. now i edit answer. – shahab Mar 05 '14 at 19:19
2

Try this code:

RewriteEngine On
RewriteBase /

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z].*?\.aspx$ - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule !\.aspx$ - [S=29]
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • that's right,but very slow server responding to url requested. – omid Mar 05 '14 at 20:12
  • Hmm if your URI is long then there might be some slowness but this is workaround to the main solution. – anubhava Mar 05 '14 at 20:18
  • 1
    "Oh, and this is actually really quick and isn't gonna slow down anything." @ https://www.askapache.com/htaccess/rewrite-uppercase-lowercase/ – sv3n Jan 12 '18 at 23:47