7

I am using:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On   
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule (.*) http://example.com/$1 [L,R=301]
</IfModule>

But I want to rewrite all uppercase characters to lowercase characters, e.g:

  • OLD: /myfolder-sample-URL.html
  • NEW: /myfolder-sample-url.html
  • To implement such redirect using mod_rewrite and .htaccess you need to use RewriteMap directive which cannot be placed in .htaccess -- only in server config / VirtualHost context. Do you have access to server config? Can you change it? If no -- then you can only implement it when executing the actual page (using PHP/ASP.NET etc). – LazyOne Aug 23 '11 at 23:45
  • Thanks for suggestion, Yes I have access to RewriteMap, so... what should I do now? – pelajar Aug 25 '11 at 1:41
9

To implement such redirect using mod_rewrite and .htaccess you need to use RewriteMap directive which cannot be placed in .htaccess -- only in server config / VirtualHost context. If you have such access:

1. Place this line inside <VirtualHost> block for your site:

RewriteMap lc int:tolower

2. Place this in your .htaccess:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

This will redirect (301 Permanent Redirect) any URL that has at least 1 capital letter (Latin letters only) in path part of URL (query string is ignored) to the same but in lower case.

For example:

http://mydomain.com/myfolder-sample-URL.html
=> 
http://mydomain.com/myfolder-sample-url.html

http://mydomain.com/myfolder-sample-url.HTML
=> 
http://mydomain.com/myfolder-sample-url.html

but will do nothing for these URLs:

http://mydomain.com/myfolder-sample-url.html?say=MEOW
http://MYDOMAIN.com/myfolder-sample-url.html

If you want to restrict it to .html files only:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^.+\.html$ ${lc:%{REQUEST_URI}} [NC,R=301,L]

Where to place: I would place it after domain name redirect rule:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^domain\.com [NC]
RewriteRule (.*) http://mydomain.com/$1 [L,R=301]

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

# your other rules

I also recommend using rel="canonical" links:

<link rel="canonical" href="PROPER_URL_HERE" />

If you do not need redirect, but rather ability to serve the file regardless of the file name case (case insensitive file names), then you can use mod_spelling ( http://httpd.apache.org/docs/current/mod/mod_speling.html ) and CheckCaseOnly On directive.

  • 1
    "If you do not need redirect, ... you can use mod_spelling" - mod_speling (one L) will, in fact, issue a 301 redirect to the intended document. – MrWhite Nov 16 '17 at 19:42
2

Add this to the top of your .htaccess

SOURCE: Htaccess to Redirect Uppercase to Lowercase

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]

Alternatively your host may support mod_speling, in which if they do, you can use in the server config, virtual host, directory or within a .htaccess file, example below:

<IfModule mod_speling.c>
    CheckCaseOnly On
    CheckSpelling On
</IfModule>
  • 3
    Is there any reason to prefer to use these 26 separate rewrite rules opposed to the two line rewrite ruling using lc: from LazyOne's answer? – Stephen Ostermiller Nov 16 '17 at 12:03
  • Depends on the situation, the one I listed requires just on htaccess however the shorter version requires both virtual host and htaccess because of the initial RewriteMap lc int:tolower requirement. – Simon Hayter Nov 16 '17 at 13:22
  • The reason I posted this answer was because I closed a very similar question which asked for a htaccess only method. – Simon Hayter Nov 16 '17 at 13:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.