首页 > nginx > nginx location匹配规则

nginx location匹配规则

2012年8月29日 发表评论 阅读评论

location 匹配命令

location 匹配的优先级(与 location 在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx 停止搜索其他匹配。
除了精确匹配,然后执行普通字符匹配(非正则表达式匹配),按最长匹配执行,找到最长前缀匹配的 location。举例来说,请求的路径是 /abcde,那么 location /abc {} 即使匹配还要再看配置中有没有更长的匹配,比如 location /abcd {}。找到这个最长匹配之后,如果他带有 ^~ 前缀,那么就不再继续查找。
找到最长前缀匹配后,比如找到了 location /abcd {},那么还要继续看有没有匹配的正则表达式,按正则表达式在配置文件中出现的顺序进行匹配,如果找到一个的正则表达式匹配,则nginx停止搜索其他匹配,执行该匹配 location。
当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的最长前缀匹配 location 会被使用。

简单来说 nginx 的 locatioin 按这个优先级规则:
= > ^~ > ~ = ~* >最长前缀匹配 > /

Location处理逻辑
1.用uri测试所有的prefix string;
2.Uri精确匹配到=定义的loacation,使用这个location,停止搜索;
3.匹配最长prefix string,如果这个最长prefix string带有^~修饰符,使用这个location,停止搜索,否则:
4.存储这个最长匹配;
5.然后匹配正则表达;
6.匹配到第一条正则表达式,使用这个location,停止搜索;
7.没有匹配到正则表达式,使用#4步存储的prefix string的location。

location 优先级官方文档

  1. Directives with the = prefix that match the query exactly. If found, searching stops.
  2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
  3. Regular expressions, in order of definition in the configuration file.
  4. If #3 yielded a match, that result is used. Else the match from #2 is used.
  1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
  3. 正则表达式,在配置文件中定义的顺序。
  4. 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。

 

例如

请求URI例子:

  • / -> 符合configuration A
  • /documents/document.html -> 符合configuration B
  • /images/1.gif -> 符合configuration C
  • /documents/1.jpg ->符合 configuration D

@location 例子
error_page 404 = @fetch;

location @fetch(
proxy_pass http://fetch;
)

转载请保留:http://blog.redis.com.cn/115.html

分类: nginx 标签: , ,
  1. mood
    2022年2月9日10:22 | #1
  2. nginx官方
    2019年1月9日12:13 | #2

    表示这里写的很是不详细啊,请问哪里有更详细的介绍?

  3. moming
  4. moming
    2018年3月13日16:22 | #4

    nginx location 正则是不是不能匹配#号啊? 下面写法都不行
    location ~* ^/#/[^\.]+\/abc/
    location ~* ^/\#/[^\.]+\/abc/
    把#换成@就没问题,求助。。。

  5. 2017年3月18日19:43 | #5

    请教一个Nginx配置问题:
    我的根目录下有index.php , usercp.php ,admincp.php 三个文件。
    我想让
    http://xxx.com/admin/xx =>这样的URL从admincp.php进入
    http://xxx.com/user/xx =>这样的URL从usercp.php进入
    http://xxx.com/xxx =>最后默认从index.php 进入

  6. mood
    2017年2月15日09:40 | #6

    @leo.xie
    需要转义表示图片后缀,不转义的情况下点可以匹配任何字符,例如,会匹配agif等样式的字符串

  7. mood
    2017年2月15日09:35 | #7

    @周葛亮
    这个解释的很好

  8. 2017年1月22日11:01 | #8

    location ~* .(gif|jpg|jpeg)$ 这句话,是否要修改成 location ~* \.(gif|jpg|jpeg)$

  9. 2016年4月11日18:08 | #9

    Location处理逻辑
    1.用uri测试所有的prefix string;
    2.Uri精确匹配到=定义的loacation,使用这个location,停止搜索;
    3.匹配最长prefix string,如果这个最长prefix string带有^~修饰符,使用这个location,停止搜索,否则:
    4.存储这个最长匹配;
    5.然后匹配正则表达;
    6.匹配到第一条正则表达式,使用这个location,停止搜索;
    7.没有匹配到正则表达式,使用#4步存储的prefix string的location。

  10. 2015年10月10日06:25 | #13

    嘿嘿~奸笑中!

  11. 2015年5月1日12:52 | #14

    good,好东西

  12. 过路人
    2015年4月7日15:52 | #15

    博主,希望你把他灭了,看着这些抄袭狗、败类就来火。
    http://blog.chinaunix.net/uid-29179844-id-4761399.html

    • 热热为
      2015年5月26日13:07 | #16

      你如何知道博主不是转载别人的?

    • 莫小醉
      2015年11月20日12:54 | #17

      打着原创的旗号抄袭是最可耻的!

  13. sinsky
    2015年1月4日14:04 | #18

    有吗 我发现我配置好的规则一但添加了wp supercache的规则后 我配的就失效了,不论是在前还是在后

    能帮忙看下么~

  14. 2014年12月14日12:07 | #19

    站长,为什么我配置的nginx拦截了好多东西?

  15. 2014年6月12日14:52 | #21

    站长大神,请问location匹配首页应该怎么写啊、想做个首页301,只跳转首页其它的不动

  16. 2014年5月29日17:33 | #22

    你好,内网可以访问,外网IP访问不了,但是用firebug调试可看到nginx 1.4.0版本等信息,说明是已被nginx 监听到,报404错误,请问是不是配置的问题?如何允许内网和外网都可以访问?

  17. sh
    2013年12月2日17:15 | #23

    写的真混乱

    • 有课
      2014年7月3日11:59 | #24

      你可以先提高点智商再来看

  18. 2013年9月11日20:16 | #25

    问好后面的参数是匹配不到的,需要借助 $query_string去判断http://blog.redis.com.cn/142.html,这篇文章可以看看

  19. 2013年9月11日17:17 | #26

    你好,我的nginx虚拟主机的root指令下,根下程序文件是否可以包括$document_root父目录文件。
    ================================
    比如:
    指令root /data/wwwroot/web1
    有以下两个程序
    /data/wwwroot/web1/index.php
    /data/wwwroot/a.php
    问题:
    index.php中是否可以包括a.php?

    • 2013年9月11日20:23 | #27

      我觉得用相对路径应该可以吧../a.php, $document_root是针对nginx来说的,并不是针对php去如何解析

  20. 2012年9月12日16:18 | #29

    我目前是这样写的,可是不管用,

    location ~ ^/?links.* {
    deny all;
    }

    请帮忙。

    • mood
      2012年9月14日14:48 | #30

      已经回复你了,有问题可以加群找我

  21. 2012年9月12日15:57 | #31

    你好,请教一个问题,请帮忙, 我有一个需求是: http://www.a.com/?links893438934**** 后面还有很长链接, 要禁止根目录下任何以 ?links 开头的链接,非常感谢了!

    • mood
      2012年9月14日14:48 | #32

      看一下http://blog.redis.com.cn/142.html 应该就知道问题了
      if ( $query_string ~* "links.*" ){
      return 404;
      }

  1. 2012年12月25日22:45 | #1
  2. 2013年6月19日14:47 | #2
  3. 2013年8月18日15:30 | #3
  4. 2013年10月10日22:00 | #4
  5. 2013年11月22日10:28 | #5
  6. 2014年3月11日15:38 | #6
  7. 2014年8月14日16:35 | #7
  8. 2014年11月5日16:29 | #8
  9. 2015年1月30日17:02 | #9
  10. 2015年3月3日20:00 | #10
  11. 2015年8月19日06:08 | #11
  12. 2016年1月20日14:15 | #12
  13. 2016年6月16日10:47 | #13
  14. 2016年12月20日01:02 | #14
  15. 2016年12月21日05:17 | #15
  16. 2017年3月16日16:41 | #16
  17. 2017年9月27日16:42 | #17
  18. 2017年11月14日16:38 | #18
  19. 2018年6月23日06:29 | #19
  20. 2019年11月20日10:27 | #20
  21. 2020年2月6日23:46 | #21
  22. 2020年2月14日15:39 | #22
  23. 2020年10月28日19:35 | #23