首页 > nginx > nginx location匹配规则

nginx location匹配规则

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

location匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配
@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

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://www.nginx.cn/115.html

除非注明,本站文章均为: nginx.cn原创,转载请注明本文地址: http://www.nginx.cn/115.html

--完--

分类: nginx 标签: , ,
  1. 2017年3月18日19:43 | #1

    请教一个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 进入

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

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

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

    @周葛亮
    这个解释的很好

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

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

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

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

    • 2016年4月11日18:09 | #6

      关键点在第三条的最长匹配。

      • 2016年4月11日18:19 | #7

        server {
        listen 80;
        server_name m4 alias m4.fengji.com;
        root /usr/shar/nginx/html;
        #1
        location = / {
        return 500;
        }
        #2
        location /a/1.html {
        return 400;
        }
        #3
        location ~ .html {
        return 401;
        }
        #4
        location /a/b {
        return 402;
        }
        #5
        location ^~ /a {
        return 403;
        }
        #6
        location = /a/1.html {
        return 404;
        }
        }

  6. 2015年10月10日06:25 | #9

    嘿嘿~奸笑中!

  7. 2015年5月1日12:52 | #10

    good,好东西

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

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

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

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

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

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

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

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

    能帮忙看下么~

  10. 2014年12月14日12:07 | #15

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

  11. 2014年6月12日14:52 | #17

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

  12. 2014年5月29日17:33 | #18

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

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

    写的真混乱

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

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

  14. 2013年9月11日20:16 | #21

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

  15. 2013年9月11日17:17 | #22

    你好,我的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 | #23

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

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

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

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

    请帮忙。

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

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

  17. 2012年9月12日15:57 | #27

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

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

      看一下http://www.nginx.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