Nginx – How to Create Case Insensitive Map Rules

nginx

I'm trying to force a URL to point to a new location. For example:

  • site.com/Gites/
  • site.com/gites/

I currently have a "map" set up on the site:

map $uri $is_rewrite {
    default     no_redirect;
    include /home/xxx/conf/web/chambres.com.extra/links.map;
}

…and inside that file, one of the rules is:

/gites/ https://$http_host;
#/Gites/ https://$http_host;
/french/Gites/ https://$http_host;

If I uncomment the 2nd line, I get an error!

nginx: [emerg] conflicting parameter "/gites/" in
/home/xxx/conf/web/chambres.com.extra/links.map:107

When I test it, sure enough, the lowercase one works, but not the uppercase "Gites". How can I make it case insensative?

Best Answer

The nginx map directive is indeed documented as doing case-insensitive string matching.

Strings are matched ignoring the case.

If this is actually a problem in your case (i.e. you need different results for /gites/ and /Gites/) then you can use a regular expression match, which can be either case sensitive or insensitive.

A regular expression should either start from the “~” symbol for a case-sensitive matching, or from the “~*” symbols (1.0.4) for case-insensitive matching.

So you could match instead:

~^/gites/ https://one;
~^/Gites/ https://two;

Keep in mind that regular expressions are only checked if there are no plain string value matches in the map.

If you don't need different results for each string, then you don't need to do anything. One string match will cover all cases.