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
匹配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 部分起始路径) > (/)