nginx的location匹配规则

  nginx提供了非常灵活的location uri路径匹配功能。在配置文件中格式如下:

语法:	location [ = | ~ | ~* | ^~ ] uri { ... }
        location @name { ... }
默认值:	—
上下文:	server, location

  先总结一下location的类型:

  • 精确匹配的location
    例如:location = /a.txt
    匹配一个为/a.txt的uri,完整的url可以是 http://host/a.txt?q=xxx

    再如:locaiton = /
    匹配一个为/的uri, 完整的url可以是 http://host/?q=xxx

  • 模糊匹配的location

    • 前缀匹配
      例如:location /a/b/c/
      匹配一个以/a/b/c/为前缀路径的uri
      完整的url可以是 http://host/a/b/c/x.jpg,或者:http://host/a/b/c/xxx/m.php?q=xxxx

    • 正则匹配

      • 不忽略大小写
        例如:location ~* .(gif|jpg|jpeg)$
        匹配所有以gif或者jpg或者jpeg为文件扩展名的uri,并且后缀名不区分大小写

      • 忽略大小写
        例如: location ~ .mp4$
        匹配所有以mp4为扩展名的uri,并且区分后缀名的大小写

      • 正则前缀匹配
        例如:location ^~ /images
        匹配所有以/images开头的uri

  • 默认匹配的location
    例如:location /
    匹配所有uri的请求

  • 命名location
    即以@开头的location,命名location不能嵌套。
    命名location不会匹配任何uri的请求,命名 ”location“ 的作用是在当前 Nginx 服务器块内部进行重定向,而不是向客户端发送 HTTP 重定向响应。它通常用于在同一个服务器块内部处理请求的不同部分,以实现代码的重用和简化配置。它也是非常有用的,有时候我们可以通过lua脚本(在openresty中)或者自研nginx插件模块,根据相应的业务规则将某些请求转发到特定的命名location中执行相应的业务逻辑。

  nginx在匹配配置文件中的location前,先会对uri进行规范化,将%XX的编码进行解码,然后解析相对路径组件中的引用 “.” 和 “…”,并将出现的连续两个或多个相邻斜杠压缩为单个斜杠。然后开始匹配:

  1. nginx执行精确匹配,匹配则选中该location并结束;
  2. nginx执行最长前缀匹配,无论是否选出最长匹配,都还需要继续进行第3步;
  3. 按配置文件中的顺序搜索正则location规则,直到匹配到第一个location规则,选中该location并结束。如果所有正则规则都没有匹配到,并且第二步已经最长匹配到了某个location,则选中该location并结束;
  4. 如果有默认匹配的location,则选中它并结束。
  5. 匹配失败,nginx最终返回404。

你可能感兴趣的:(nginx学习,nginx,运维,location,匹配规则)