Shaun
Shaun

Reputation: 2181

Changing last part of URL to be uppercase using htaccess?

Not sure if this is a smart way to deal with the problem, which is...

I have a bunch of user dirs that make up a part of their url, eg

www.mysite.com/users/USERDIR

When I created the site (and since then), user dirs are created using capitals. I wish I hadn't, but it's done. so if someone types in www.mysite.com/users/userdir - it can't find that dir - it has to be in capitals like www.mysite.com/users/USERDIR.

I was wondering....

a) is there a way to tell htaccess "ignore the case when looking for the url?"

or

b) is there a way to deal with this in htaccess, so that no matter what case the user uses, my server will ALWAYS convert the USERDIR to capitals? I need to take into account that some people might type www.mysite.com/users/USERDIR/index.php, and www.mysite.com/users/USERDIR/ with a trailing slash.

I've found some code that converts from lower to upper case letters (below), but is there a way to say "only do this for anything after mysite.com/users/ until either the end or the next slash if one is entered"?

Note - the following does the opposite to what I'm after re case - I just haven't yet recoded it to convert lower to upper.

RewriteEngine On
RewriteBase /

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

# Skip this entire section if no uppercase letters in requested URL
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]

Thanks for taking a look!

Upvotes: 2

Views: 1295

Answers (1)

anubhava
anubhava

Reputation: 785471

a) is there a way to tell htaccess "ignore the case when looking for the url?"

Yes there is. Use NC flag in your rules to for case ignore matching.

no matter what case the user uses, my server will ALWAYS convert the USERDIR to capitals?

If you have access to Apache config then much simpler is to add this line in Apache config:

RewriteMap uc int:toupper

Then in your .htaccess use this rule to convert your URIs to upper case:

RewriteRule ^(users)/(.*?[a-z]+.*)$ /$1/${uc:$2} [R,L]

Upvotes: 3

Related Questions