• nginx中 location正则的理解


    文章转载自:https://blog.csdn.net/wzj_110/article/details/110142902

    正则表达式在线测试工具:https://tool.lu/regex

    location中的正则表达式

    location的作用

    location指令的作用是根据'用户请求的URI'来执行'不同的应用',也就是根据用户请求的网站URL'进行匹配',匹配'成功-->success'即进行'相关的操作'

    针对 URL 中'不同的路径'分别可以配置'不同的处理路径'

    location的语法

    location [=|~|~*|^~] /uri/ {
       ......
    }
    

    location的正则

    ~      区分大小写'大小写敏感'匹配成功 
    ~*     '不区分大小'写匹配成功 
    !~     区分大小写匹配'失败-->!(取反)'
    !~*    不区分大小写匹配失败
    ^      以'什么开头'的匹配
    $      以'什么结尾的匹配'
    *      代表'任意字符'
    =    '精准匹配'-->如location=/,只会匹配url为/的请求
    /    '通用匹配',如果没有其它匹配,任何请求都会被匹配到
     
    ++++++++++++++++++++++'分割线'++++++++++++++++++++++
     
    ^~    标识符匹配后面跟'一个字符串',匹配字符串后将'停止-->stop'对后续的正则表达式进行匹配,如'location ^~ /images/',在匹配了/images/这个字符串后就'停止'对后续的正则匹配
     
    备注: '~'开头的都是'正则匹配',例如'^~'不是正则匹配
    

    案例讲解

        (1) location = /
         
        特点: 匹配'任何查询',因为所有请求'都以 / 开头'
         
        (2) location ^~ /images/ {
         
        特点: 匹配任何以'/images/'开头的任何查询并且停止搜索,任何正则表达式将不会被测试。
         
        (3) location ~* .(gif|jpg|jpeg)$ {
         
        特点: 匹配任何以'.gif、.jpg 或 .jpeg 结尾'的请求
    

    转义

    ~^ /prefix/.*\.html$ 
     
    解释:~ 表示后面跟的是'正则',而且是区分大小写的( "~ "区分大小写,"~* "不区分大小写)
     
    ^/prefix/.*\.html$  就是'正则表达式了'
     
    1) ^在正则里表示,以什么'开始'
     
    2) /prefix/ 表示符合这个'文件夹路径的'
     
    3) ".*" 表示匹配'单个字符多次'
     
    4) "\." 表示转义 "."  采用 "." 本身,而非他在'正则里'的意思(非\r\n的单个字符)。
     
    5) $ 表示以什么'结尾'
    

    细节测试

    三个规则

    root和alias的区别

    root与alias'主要区别': 在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上
     
    root的处理结果是:  root路径'+'location路径
     
    alias的处理结果是: 使用alias路径'替换'location路径 --> 特点:'浏览器请求的url路径在后端不一定是真实存在'
     
    alias是一个'目录别名的定义',root则是'最上层目录'的定义
     
    还有一个'重要的区别'是alias后面必须要用'/'结束,否则会'404-->找不到文件'的
    
        (1) 测试1-->请求以'/hello'开头
         
        location /hello { 
           alias '/usr/share/nginx/html/ceshi';  -->'alias就是目录别名,所以alias后面加"/"与否没有意义'
        }
         
        '请求': http://nginx.wzj.com/hello/404.html 
         
        '实际访问': /usr/share/nginx/html/ceshi/404.html
         
        +++++++'分割线'+++++++
         
        (2) 测试2
         
        location /ceshi1 {                                                                                                                                                                                             
                
             root '/usr/share/nginx/html';
        }
         
        '请求': http://nginx.wzj.com/ceshi1/
         
        '实际访问': /usr/share/nginx/html/ceshi1/index.html
    

    补充

    注意事项:
     
    (1) 使用正则那么 location '定义的顺序'很重要,第一个匹配的正则,之后就立即执行了
     
    (2) 使用精确匹配可以'提高查询速度',比如经常请求的路径可以精确匹配 =
     
    ++++++++++++++'分割线'+++++++++++++++
     
    思考: 一个具体的请求 path 过来之后,Nginx 的'具体匹配过程'可以分为这么几步:
     
    1) 检查'前缀字符-->前缀匹配'定义的 location,记录'最长'的匹配项-->'record'
     
    2) 如果找到了'精确匹配 = '的 location,结束查找'只用该配置'
     
    3) 按'顺序查找正则'定义的 location,如果匹配则停止查找
     
    4) 如果'没有匹配的正则',则使用之前'记录的最长'匹配 location
    

    location中的url

    测试

    nginx配置proxy_pass中url末尾带/与不带/的区别

    在使用proxy_pass指令时,如果'不想改变原地址'中的URI,就'不要在'URL变量中'配置URI'

    (1)配置proxy_pass时,当在'后面的url加上了/',相当于是'绝对根路径',则nginx'不会'把location中匹配的路径部分'代理走';如果没有/,则会把'匹配的路径'部分也给'代理'走
     
    (2)proxy_pass配置中'url末尾带/'时,nginx转发时,会将'原uri去除'location'匹配'表达式后的内容'拼接'在proxy_pass中url之后
    
    ### 末尾带/ 
    
    测试地址:http://192.168.171.129/test/tes.jsp
     
    '场景一':
    location ^~ /test/ {
        proxy_pass http://192.168.171.129:8080/server/;
    }
    代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp -->'test由于匹配,所以会去除,然后拼接未匹配的'
     
    '场景二':
    location ^~ /test {
        proxy_pass http://192.168.171.129:8080/server/;
    }
    代理后实际访问地址:http://192.168.171.129:8080/server//tes.jsp
     
    '场景三':
    location ^~ /test/ {
        proxy_pass http://192.168.171.129:8080/;
    }
    代理后实际访问地址:http://192.168.171.129:8080/tes.jsp
     
    '场景四':
    location ^~ /test {
        proxy_pass http://192.168.171.129:8080/;
    }
    代理后实际访问地址:http://192.168.171.129:8080//tes.jsp
    
    ### 末尾不带/
    
    proxy_pass配置中'url末尾不带/时',如url中'不包含path',则直接将'原uri拼接'在proxy_pass中url之后;如url中'包含path',则将原uri'去除location匹配表达式后的内容'拼接在proxy_pass中的url之后
    
     测试地址:http://192.168.171.129/test/tes.jsp
    '场景一':
     location ^~ /test/{
    	proxy_pass http://192.168.171.129:8080/server;
     }
     代理后实际访问地址:http://192.168.171.129:8080/'servertes.jsp' -->'去除"/test/",然后拼接'
    '场景二':
    location ^~ /test {
        proxy_pass http://192.168.171.129:8080/server;
    }
    代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp   -->'去除"/test",然后拼接"/tes.jsp"-->场景一和场景二的区别'
     
    '场景三':
    location ^~ /test/ {
        proxy_pass http://192.168.171.129:8080;
    }
    代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp     -->'场景三和场景四常用'
     
    '场景四':
    location ^~ /test {
        proxy_pass http://192.168.171.129:8080;
    }
    代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp
    

    小结

        (1) location的配置有两种形式,'前缀字符'和'正则',查找匹配的时候,'先'查找'前缀'字符,选择'最长'匹配项,'再查找'正则,正则的优先级高于'前缀字符-->普通匹配'
         
        (2) 正则的查找是按照在'配置文件中的顺序'进行的,因此正则的顺序很重要,建议'越精细'的放的'越靠前'
         
        (3) 使用=精准匹配可以加快查找的顺序,如果根域名经常被访问的话建议使用=
    
  • 相关阅读:
    sql developer Oracle 数据库 用户对象下表及表结构的导入导出
    安装Win7和Office2010并激活
    Python内置方法的时间复杂度(转)
    服务框架Dubbo(转)
    ntpd和ntpdate
    ntpdate server时出错原因及解决
    什么才是程序员的核心竞争力
    使用DNSPod来处理网站的均衡负载(转)
    ubuntu设置服务开机启动
    Linux运行级别
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/16292362.html
Copyright © 2020-2023  润新知