目录

  • 前言
  • 一、location区段
  • 二、location前缀匹配
  • 三、location配置实例
  • 3.1 无修饰符
  • 3.2 =匹配
  • 3.3 ~匹配
  • 3.4 ^~匹配
  • 3.5 ~*匹配
  • 总结


前言

Nginx 的 HTTP 配置主要包括三个区块,结构如下:

http { 						#协议级别
  include mime.types;
  default_type application/octet-stream;
  keepalive_timeout 65;
  gzip on;
  
    server {			    #这个是服务器级别
      listen 80;
      server_name localhost;
      
        location / {   #这个是请求级别
          root html;
          index index.html index.htm;
        }
    }
}

一、location区段

  • location 是在 server 块中配置,根据不同的 URI 使用不同的配置,来处理不同的请求。
  • location 是有顺序的,会根据不同请求配置的优先级来匹配的location 处理。
  • 基本语法如下:
location [=|~|~*|^~|@] pattern{……}

二、location前缀匹配

=    #表示精确匹配,优先级也是最高的 
^~   #表示uri以某个常规字符串开头,理解为匹配url路径即可 
~    #表示区分大小写的正则匹配  
~*   #表示不区分大小写的正则匹配
!~   #表示区分大小写不匹配的正则
!~*  #表示不区分大小写不匹配的正则
/    #通用匹配,任何请求都会匹配到
@    #内部服务跳转

匹配优先级:

  • 匹配优先级为:从上(=)至下(@)优先级依次递减,也就是说“=”的优先级最高,“@”优先级最低。
  • 多个location配置的情况下匹配顺序为:首先匹配 =,其次匹配^~, 其次是按正则匹配,最后是交给 / 通用匹配。**当有匹配成功时候,停止匹配,**按当前匹配规则处理请求。

三、location配置实例

3.1 无修饰符

必须以指定模式开始

server {
    listen       80;
    server_name  localhost;

    location  /a {
        root    /var/www/nginx;
        index   test.html;
    }
}
[root@server-yum1 ~]# mkdir /var/www/nginx/a/ -p
[root@server-yum1 ~]# echo "hello world !!" >> /var/www/nginx/a/test.html

浏览器端访问:http://10.20.151.8/a/

nginx env 指令_优先级

3.2 =匹配

server {
    listen       80;
    server_name  localhost;
    access_log  /var/log/nginx/http_access.log  main;

    location / {
        root /var/www/nginx/;
        index a.html index.htm;
    }
    location = / {
        root /var/www/nginx/;
        index b.html index.htm;
    }
}
[root@server-yum1 ~]# echo "location /" > /var/www/nginx/a.html
[root@server-yum1 ~]# echo "location /" > /var/www/nginx/b.html

(1)浏览器端访问:http://10.20.151.8/

在没有跟具体路径时,会优先匹配有“=”的location

nginx env 指令_nginx env 指令_02


(2)浏览器端访问:http://10.20.151.8/a.html

如果跟了具体路径时,会优先匹配a.html所在的location

nginx env 指令_nginx_03

3.3 ~匹配

server {
server_name localhost;
  
  location ~ /a {           #区分(a)大小写的正则匹配
        root /var/www/nginx;
        index a.html index.html;
    }
}
[root@server-yum1 ~]# echo "location ~ /a" > /var/www/nginx/a/a.html

(1)浏览器端访问:http://10.20.151.8/a/

nginx env 指令_nginx_04


(2)浏览器端访问:http://10.20.151.8/A/

nginx env 指令_nginx env 指令_05

3.4 ^~匹配

server {
server_name localhost;

   location ^~ /it/ {       #匹配任何以/it/开始的查询并且停止搜索,不检查正则表达式
       root    /var/www/nginx;
       index   m.html;
   }
}
[root@server-yum1 ~]# mkdir /var/www/nginx/it
[root@server-yum1 ~]# echo "location ^~ /it" > /var/www/nginx/it/m.html

浏览器端访问:http://10.20.151.8/it/

nginx env 指令_nginx env 指令_06

3.5 ~*匹配

server {
server_name localhost;

   location  ~* \.png$ {         #不区分大小写匹配所有以.png结尾的文件
       root    /var/www/nginx;   #上传图片到发布目录中
   }
}
[root@server-yum1 nginx]# rz -y  #上传test.png图片

浏览器端访问:http://10.20.151.8/test.png

nginx env 指令_优先级_07

总结

location 区段匹配示例:

location = / {              # 只匹配 / 的查询
  [ configuration A ]
}
location / {                # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配
  [ configuration B ]
}
location ^~ /images/ {      # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式
  [ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif、jpg、jpeg结尾的文件
  [ configuration D ]
}