user2406629
user2406629

Reputation: 11

301 redirect but change URL to all lower case in apache

I'd like to set up a 301 redirect in Apache to change the case of the original address before redirecting. So for example if someone enters:

www.website1.com/UsErOfMiXedCase

it should forward to

www.website2.com/userofmixedcase

Would this be a redirect or would it need to be a rewrite? I'm not fussed about individual page forwarding (eg www.website2.com/userofmixedcase/whatever.php) - just www.website1.com/whatever.

Thank you in advance, Richard

Upvotes: 1

Views: 1712

Answers (2)

Jon Lin
Jon Lin

Reputation: 143906

You need to define the rewrite map using Apache's internal tolower function. This can only be done in vhost or server config, and will result in an error if you try to put these directives in an htaccess file:

RewriteEngine On
RewriteMap lowercase int:tolower

Then, in your htaccess file, you can use something like this above any rewrite rules you already have. The redirect rules must be before whatever rules you may have that does routing:

# check that the lower case version of the URI is different than the unchanged URI
RewriteCond %{REQUEST_URI} ^/([^/]+)$
RewriteCond ${lowercase:%1}::%1 !^(.*)::\1$
RewriteRule ^/?(.+)$ http://www.website2.com/${lowercase:$1} [L,R=301]

This will redirect a request like http://www.website1.com/UsErOfMiXedCase to http://www.website2.com/userofmixedcase, thus replacing the URL in the browser's address bar with the one that's all lowercase. Note that it won't affect URLs with multiple path nodes, e.g. http://www.website1.com/SoMe/PathName/UsErOfMiXedCase. If you want it to affect all requests including ones that have multiple paths/subdirectories, then you need to change this line:

RewriteCond %{REQUEST_URI} ^/([^/]+)$

to:

RewriteCond %{REQUEST_URI} ^/(.+)$

Upvotes: 1

terryjbates
terryjbates

Reputation: 312

You are wanting to use mod-rewrite for this. Something like:

RewriteRule ^/(.*) http://website2.com/$1 [NC]

That is a very general rule, so anything after the leading slash will be lower case. You may want to only do the lower case for specific portions of URL, but I cannot speak to that.

You probably should eyeball the Apache mod-rewrite documentation about the NC flag about this as well.

hth!

Upvotes: 0

Related Questions