Nginx-路由匹配规则


Nginx localhost路由匹配规则

URI 即统一标识资源符,通用的 URI 语法格式如下:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

格式说明如下:

  • 在 Nginx 的应用场景中,URL 与 URI 并无明确区别。URI 标准(RFC3986)中约定,URL 是 URI 的一个子集;
  • scheme 是 URI 请求时遵守的协议,常见的有 HTTP、HTTPS、FTP;
  • host[:port] 是主机名与端口号,HTTP 协议的默认端口是 80,HTTPS 协议的默认端口是 443;
  • [/path] 是访问路径与访问文件名;
  • [?query] 是访问参数,访问参数以“?”开始作标识,由多个以“&”连接的 key=value 形式的字符串组成。
语法 location [= | ~ | ~* | ^~ | @] pattern { ... }
位置 server,location

其中,[=||*|^~|@]部分称为 location 修饰语(Modifier),修饰语定义了与 URI 的匹配方式。pattern 为匹配项,可以是字符串或正则表达式。

URI 匹配规则

uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。

无修饰语

:完全匹配 URI 中除访问参数以外的内容,匹配项的内容只能是字符串,不能是正则表达式,要求必须以指定模式开始;

   server {
        listen 80;
        server_name localhost;
        location /abc {
            default_type text/plain;
            return 200 "access success";
        }
    }

以下访问:只要以abc开始就可以匹配,?后的都是访问参数

    http://192.168.204.131/abc/def
    http://192.168.204.131/abc?p1=TOM
    http://192.168.204.131/abc/
    http://192.168.204.131/abcdef

修饰语"="

:完全匹配 URI 中除访问参数以外的内容,Linux 系统下会区分大小写,Windows 系统下则不会。

   server {
        listen 80;
        server_name localhost;
        location =/abc {
            default_type text/plain;
            return 200 "修饰语 = success";
        }
    }

以下访问:只能完全匹配abc. ?后的都是访问参数

    #可以匹配
    http://192.168.204.131/abc
    http://192.168.204.131/abc?p1=TOM
    #匹配不到
    http://192.168.204.131/abc/
    http://192.168.204.131/abcdef
    http://192.168.204.131/abc/def

修饰语"~"

:完全匹配 URI 中除访问参数以外的内容,Linux 系统下会区分大小写,Windows 系统下不会。匹配项的内容必须是正则表达式。~ 区分大小写,~* 不区分大小写

server {
        listen 80;
        server_name localhost;
        location ~ ^/abc\w*$ {
            default_type text/plain;
            return 200 "修饰语 ~ success";
        }
    }
server {
        listen 80;
        server_name localhost;
        location ~* ^/abc\w*$ {
            default_type text/plain;
            return 200 "修饰语 ~* success";
        }
    }

以下访问:

    #可以匹配 \w* 表示abc后可以有单词,出现{0,}
    http://192.168.204.131/abc
    http://192.168.204.131/abc/efg
    http://192.168.204.131/abcd?p1=TOM
    http://192.168.204.131/abcd/efg?p1=TOM

修饰语"^~"

:完全匹配 URI 中除访问参数以外的内容,匹配项的内容如果不是正则表达式,则不再进行正则表达式测试。

   server {
        listen 80;
        server_name localhost;
        location ^~ /abc {
            default_type text/plain;
            return 200 "修饰语 ^~ success";
        }
    }

修饰语"@"

:定义一个只能内部访问的 location 区域,可以被其他内部跳转指令使用,如 try_files 或 error_page。

匹配顺序

  1. 先检测匹配项的内容为非正则表达式修饰语的 location,然后再检测匹配项的内容为正则表达式修饰语的 location。
  2. 匹配项的内容为正则与非正则都匹配的 location,按照匹配项的内容为正则匹配的 location 执行。
  3. 所有匹配项的内容均为非正则表达式的 location,按照匹配项的内容完全匹配的内容长短进行匹配,即匹配内容多的 location 被执行。
  4. 所有匹配项的内容均为正则表达式的 location,按照书写的先后顺序进行匹配,匹配后就执行,不再做后续检测。