Nginx路由详解

本文总结Nginx的location配置策略。结合案例说明location的用法。

location配置语法:location [=|~|~*|^~] /uri/ { … }
1、 =。精确匹配查血前缀,如果找到路径,则停止向下匹配。
2、 ~。使用正则表达式匹配,该符号表示大小写敏感。
3、 ~*。使用正则表达式匹配,表示大小写不敏感。
4、 ^~。匹配常规字符串,表示以该字符串开头的路径。

相对应的四个经典案例介绍

location = / {
    #精确匹配,只匹配/查询
}

location / {
    #匹配任何查询,所有请求都是以/开头。但是正则表达式规则和长的块规则将被优先匹配和查询;
}

location ^~ /images/ {
    # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}

location ~* \.(gif|jpg|png)${
    #匹配任何以gif、jpg、png结尾的请求。然后所有/images/目录的请求将使用第三个
}

例子请求:

/ -> configuration A

/documents/document.html -> configuration B

/images/1.gif -> configuration C

/documents/1.jpg -> configuration D

下面是详细的八个案例:

location = / { 
    #精确匹配,/后面不能加任何字符串,符合此条件就直接返回数据,不再像下匹配。
    if (-d $request_filename) {
         root /usr/local/nginx/html/;  #当用户访问newweb的时候,则显示此目录的内容,除此之外访问其他的任何目录都不匹配。
  [动作A]
}

location  / {
    #因为所有的地址都以/开头,所以这条规则将匹配到所有请求,但是非精确匹配会采取正则和最长字符串会优先匹配,因此还会向下继续匹配,比如当访问/bbs的时候,还需要看下面是否更精确的匹配。
    [ 动作B] 
}

location /documents/ {
    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
    # 如果后面的正则表达式都没有匹配到,就匹配这一条
    [动作C] 
}

location ^~ /images/ {   
  # 匹配任何以/images/ 开头的任何请求并且停止搜索,后面任何正则表达式将不会被测试。
  [动作D] 
}

location ~* \.(gif|jpg|jpeg)$ { 
    #~* 为不区分大小写
    # 匹配所有以 gif,jpg或jpeg 结尾的请求
    # 然而,所有请求/images/下的图片会被动作D匹配处理,因为动作D有^~会优先匹配并终止匹配,所以到达不了这一条正则
    [动作E] 
}

location /images/ {
    # 字符匹配到 /images/,继续往下,会发现 ^~ 存在,如果动作D存在,则这一条就不生效。
    [动作F] 
}

location /images/abc {
    #最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在,如果D存在,则这一条就不生效。
    #F与G的放置顺序是没有关系的
    [动作G] 
}

location ~ /images/abc/ {
    # 动作D存在,这一条不生效,如果注销动作D,则会优先最长匹配 动作G 开头的地址,然后向下匹配,到这一条的时候就会匹配并生效。
    [ configuration H ] 
}

 匹配优先级,顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

上面的匹配结果
按照上面的location写法,以下的匹配示例成立:

/ -> config A
精确完全匹配,即使/index.html也匹配不了

/downloads/download.html -> config B
匹配B以后,往下没有任何匹配,采用B

/images/1.gif -> configuration D
匹配到F,往下匹配到D,停止往下

/images/abc/def -> config D
最长匹配到G,往下匹配D,停止往下
你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序

/documents/document.html -> config C
匹配到C,往下没有任何匹配,采用C

/documents/1.jpg -> configuration E
匹配到C,往下正则匹配到E

/documents/Abc.jpg -> config CC
最长匹配到C,往下正则顺序匹配到CC,不会往下到E

你可能感兴趣的:(Nginx路由详解)