美文网首页nginx 后台技术
Nginx location配置类别和匹配优先级

Nginx location配置类别和匹配优先级

作者: f9f73935e28c | 来源:发表于2016-11-02 20:12 被阅读392次

    location功能:

    匹配的ngnix变量:$request_uri
    作用:定义url匹配模式,可以根据请求uri判断相应配置
    配置文件中一般有多个location,分别定义了不同的匹配模式,不同的uri根据匹配结果获取不同的配置。

    location的匹配模式:

    location的匹配都是前缀匹配。格式:

    location [ 空格 | = | ~ | ~* | !~ | !~* ] /uri/ {}
    

    分为3类:

    • 精确模式:精确匹配(=)
    • 前缀模式: 普通匹配(空格),非正则匹配(^~)
    • 正则模式: 大小写敏感匹配(~),大小写不敏感匹配(~*),大小写敏感不匹配(!~),大小写不敏感不匹配(!~*)

    location匹配优先级:

    1. 先匹配精确模式,命中精确模式,直接返回。否则,继续匹配前缀模式。
    2. 前缀模式中使用最大前缀原则,选出匹配普通匹配(空格)或非正则匹配(^~)的最长location。
    3. 若最长前缀location是非正则匹配(^~),则返回该最长前缀location。否则,还需要继续匹配正则模式。
    4. 正则模式的原则是按照正则location定义顺序匹配,第一个匹配的location为正则模式结果。
    5. 若正则模式匹配成功,返回正则模式结果。否则,返回前缀模式中的最长前缀location。
    6. 在nginx版本0.7.1 - 0.8.41中,若前缀模式的最长前缀location精确匹配uri,直接返回最长前缀location。
    if 精确匹配结果
        return  精确匹配结果
    最长前缀结果 = longest: 普通匹配(空格) or 非正则匹配(^~)
    if 最长前缀结果 属于 非正则匹配(^~)
        return 最长前缀结果
    if 版本 属于 0.7.1 - 0.8.41 and 最长前缀结果 == uri:
        return 最长前缀结果
    首个正则结果 = first: 大小写敏感匹配(~) or 大小写不敏感匹配(~*) or 大小写敏感不匹配(!~) or 大小写不敏感不匹配(!~*)
    if 首个正则结果:
        return 首个正则结果
    else:
        return 最长前缀结果
    

    示例

    location / {}
    

    前缀模式,匹配所有uri,最短匹配
    所以,这个location为兜底location。即当其他所有location都不匹配时,命中这个location。

    location = / {
        [ 配置 A ]
    }
    
    location / {
        [ 配置 B ]
    }
    
    location /documents/ {
        [ 配置 C ]
    }
    
    location ^~ /images/ {
        [ 配置 D ]
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
        [ 配置 E ]
    }
    

    uri:“/”
    精确匹配:配置 A
    uri:“/index.html”
    兜底匹配:配置 B
    uri:“/documents/document.html”
    最长location匹配:配置 C
    uri:“/images/1.gif”
    非正则匹配:配置 D
    uri:“/documents/1.jpg”
    正则匹配:配置 E

    内部location(@)

    内部location不能被外部 Client 所访问,只能用于重定向。它不能被嵌套,也不能包含嵌套的location。格式为:

    location @name {}
    

    示例:

    error_page 404 = @fallback
    location @fallback {
    }
    

    特殊处理location

    若前缀模式location以斜杠(/)结尾,并且请求设置由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass或 memcached_pass等处理器处理,则使用该处理器处理。
    但对于末尾不带斜杠的uri,这时会返回301并重定向到带斜杠的uri,继而匹配该location。

    location /user/ {
        proxy_pass http://user.example.com;
    }
    

    uri: /user/
    转发到ttp://user.example.com
    uri:/user
    返回301,并重定向到/user/
    如果不希望自动重定向,可以定义两个location,设置不同配置:

    location /user/ {
        proxy_pass http://user.example.com;
    }
    location = /user {
        proxy_pass http://login.example.com;
    }
    
    ```
    uri:/user/
    转发到http://user.example.com;
    uri:/user
    转发到http://login.example.com;

    相关文章

      网友评论

        本文标题:Nginx location配置类别和匹配优先级

        本文链接:https://www.haomeiwen.com/subject/umfbuttx.html