nginx map rules, case insensative

Andrew Newby asked:

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?

My 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.


View the full question and any other answers on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.