ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置。

在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。


语法规则

location [ = | ~ | ~* | ^~ ]   /uri/    { ... }
  • = #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
  • ^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左边部分做匹配检查,不区分字符大小写
  • ~ #用于标准uri前,表示包含正则表达式,并且区分大小写
  • ~* #用于标准uri前,表示包含正则表达式,并且不区分大写
  • 不带符号 #匹配起始于此uri的所有的uri
  • \ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
  • $ #用于标准uri前,表示包含正则表达式并且匹配以什么结尾
  • * #用于标准uri前,表示包含正则表达式并且代表任意长度的任意字符

匹配优先级(优先级从高到低 )

=, ^~, ~,~*, 不带符号

location优先级:(location =) > (location ^~ 路径) > (location ~,~* 正则顺序) >(location 完整路径) > (location 部分起始路径) > (/)


精确匹配例子( = )

分别放两张文件名相同(1.jpg)但内容不同的图片到默认的网站根目录/data/nginx/html/uhn和location目录/web/uhn/jqpp中。

访问http://www.uhn.cn/1.jpg

如果配置文件启用精确匹配,则显示/web/uhn/jqpp目录中的图片,如果注释掉精确匹配,则显示默认根目录下的图片

配置文件如下:

server {
   listen 80;
   server_name www.uhn.cn;

   location / {
   root /data/nginx/html/uhn;
   }

#   location = /1.jpg {
#   root /web/uhn/jqpp;
#   index index.html;
#   }

}

区分大小写的模糊匹配例子( ~ )

复制图片文件到/web/uhn/mhpp

[root@localhost conf.d]# mkdir /web/uhn/mhpp

[root@localhost conf.d]# cp /web/uhn/jqpp/1.jpg /web/uhn/mhpp/Demo.jpg

修改配置文件

server {
   listen 80;
   server_name www.uhn.cn;

   location / {
   root /data/nginx/html/uhn;
   }

    location ~ /D.*\.jpg {
    root /web/uhn/mhpp;
    }

}

由于区分大小写

此时使用浏览器访问 http://www.uhn.cn/demo.jpg 无法显示,报404错误(由于匹配不上这个location,所以回去网站的根目录/data/nginx/html/uhn下找demo.jpg)

如果使用浏览器访问http://www.uhn.cn/Demo.jpg 则可以正常显示图片

不区分大小写的模糊匹配例子( ~* )通常生产环境都不区分大小写

修改配置文件

server {
   listen 80;
   server_name www.uhn.cn;

   location / {
   root /data/nginx/html/uhn;
   }

    location ~* /D.*\.jpg {
    root /web/uhn/mhpp;
    }

}

此此时使用浏览器访问 http://www.uhn.cn/demo.jpg 依然无法显示,报404错误。因为需要/web/uhn/mhp下有一个小写d开头的demo.jpg图片。


匹配URI开头的例子( ^~ )

创建一个测试目录head,和一个主页文件

[root@localhost ~]# mkdir -p /web/uhn/head/image2014

[root@localhost ~]# cd /web/uhn/head/image2014

[root@localhost image2014]# echo "head page" >index.html

修改配置文件 将访问image开头的流量,定位到 /web/uhn/head

[root@localhost conf.d]# vi uhn.conf 

server {
   listen 80;
   server_name www.uhn.cn;

   location / {
   root /data/nginx/html/uhn;
   }
 
   location ^~ /image {
   root /web/uhn/head;
   index index.html;
   }

}

访问测试,确实匹配上了,并且定位到了/web/uhn/head/image2014

关于nginx配置文件中的location配置的匹配规则_nginx

匹配URI开头的例子( $ )

一旦用户访问.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)后缀的文件,就去/data/nginx/static路径下找到返回给用户

location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {

root /data/nginx/static;
index index.html;

}


location优先级:(location =) > (location ^~ 路径) > (location ~,~* 正则顺序) >(location 完整路径) > (location 部分起始路径) > (/)