• Nginx Location路由规则配置


    介绍

    location路由匹配发生在HTTP请求处理的find-config配置查找阶段,主要功能是:根据请求的URI地址匹配location路由表达式,如果匹配成功,就执行location后面的上下文配置块。

    location 4中配置

    语法格式

    location [=|~|~*|^~] 模式字符串 {
    	...
    }
    

    按照匹配的符号不同,location路由匹配主要分成精准匹配、普通匹配、正则匹配、默认根路径匹配。

    1. 精准匹配

    如果请求URI和精准匹配的模式字符串/lua完全相同,那么精准匹配通过。前面加上一个 = 即可,如 loction = /lua/
    在所有的匹配类型中,精准匹配的优先级最高。

    2. 普通匹配

    普通匹配的符号标记为“^~”

    location ^~ /lua {
    	echo "hit location: ^~ /lua";
    }
    

    普通匹配属于字符串前缀匹配,详细来说:如果请求路径URI头部匹配到location的模式字符串,那么匹配成功。如果匹配到多个前缀,那么最长模式匹配优先。
    普通匹配是前缀匹配,也是Nginx默认的匹配类型。也就是说,类型符号“^~”可以省略,如果location没有任何匹配类型,就为普通的前缀匹配。

    # 不带类型符号,默认为普通匹配
    location /demo {
     echo "hit location: /demo ";
    }
    # 带“^~”符号,普通匹配
    location ^~ /demo {
     echo "hit location: ^~ /demo";
    }
    

    这两种效果相同

    3. 正则匹配

    正则匹配的类型按照类型符号的不同可以细分为以下4种
    (1)~:标准正则匹配,区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。
    (2)~:标准正则匹配,不区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。
    (3)!~:反向正则匹配,区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。
    (4)!~
    :反向正则匹配,不区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。

    #正则匹配
     location ~*hello\.(asp|php)$ {
     	echo "正则匹配: hello.(asp|php)$ ";
     }
    

    注意:
    如果配置文件中存在多个正则匹配location,那么它们之间的规则是顺序优先的,只要匹配到第一个正则类型的location,就停止后面的正则类型的location测试。

    4. 默认根路径匹配

    根路径的路径规则就是使用单个“/”符号,示例如下:

    location / {
       echo "默认根路径匹配: /";
    }
    

    不能匹配到其他的location,只能匹配到“/”根路径
    表面看上去,location/{...}根路径匹配非常类似普通匹配,但实际上该规则自成一类,虽然只有唯一的一个路径,但是此类规则优先级是最低的。

    总结:

    1. 类型之间的优先级:精准匹配>普通匹配>正则匹配>“/”默认根路径匹配。
    2. 普通匹配同类型location之间的优先级为最长前缀优先。普通匹配的优先级与location在配置文件中所处的先后顺序无关,而与匹配到的前缀长度有关。
    3. 正则匹配同类型location之间的优先级为顺序优先。只要匹配到第一个正则规则的location,就停止后面的正则规则的测试。正则匹配与location规则定义在配置文件中的先后顺序强相关。

    常用的location路由配置

    location / {
     root html;
     index index.html index.htm;
    }
    

    表示在请求URI匹配到“/”根路由规则时,首先Nginx会在html目录下查找index.html文件,如果没有找到,就查找index.htm文件,将找到的文件内容返回给客户端。
    “/”根路由规则也可以路由到一个访问很频繁的上游服务,比如Spring Cloud微服务架构中的服务网关:

    location / {
       proxy_pass http://127.0.0.1:7799/;
    }
    

    注意:此处proxy_pass值后面有没有这个斜杠,很重要;
    示例说明:

    location /user/ {
       proxy_pass http://127.0.0.1:7799/;
    }
    

    上面示例,会将请求转发到 http://127.0.0.1:7799/xxxxx
    后面有斜杠相当于没有斜杠时,对地址进行了重写,

    location ^~/user/ {
            proxy_set_header Host $host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
    
            rewrite ^/user/(.*)$ /$1 break;
            proxy_pass http://127.0.0.1:7799;
        }
    

    注意:
    proxy_set_header可以在三处地方使用,分别是http, server, location, 但是继承关系在官方文档明确说明了,本层如果没有定义任何proxy_set_header,就从上层继承,如果已经定义了,就不会从上层进行继承;
    image.png

    此处proxy_pass后面没有/, 进行了rewrite重写,效果会将请求转发到 http://127.0.0.1:7799/xxxxx

    # http://grandpic.oss-cn-shanghai.aliyuncs.com/illegal/20211231/34020000001320001030/10.210.103.175_01_20211231164609541_TIMING.jpg
    # 经过改代理后,图片就变为了
    # http://grandpic.oss-cn-shanghai.aliyuncs.com/pics/illegal/20211231/34020000001320001030/10.210.103.175_01_20211231164609541_TIMING.jpg
    	location ^~ /illegal/ {
    		proxy_pass https://zhst-obs-01.obs.cn-southwest-217.tianfugongyuancheng.com/pics/illegal/;
    	}
    
    
    location /user/ {
       proxy_pass http://127.0.0.1:7799;
    }
    

    上面示例,会将请求转发到 http://127.0.0.1:7799/user/xxxxx
    ^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/user/*后面的路径直接拼接到后面,即移除user.

    root /www/resources/static/;
     #前缀匹配
    location ^~ /static/ {
     root /www/resources/;
    }
    

    所有匹配/static/...规则的静态资源请求(如/static/img/1.png)都将路由到root指令所配置的文件目录/www/resources/static/下对应的某个文件(如/www/resources/static/img/1.png),root最后面跟上/,和proxy_pass的效果不同。

    # 如果 url 含有 .  , 并且 不以 do 或 action 结尾,则匹配成功。
    location ~ .*\.(?!(do|action)$) {
    	root /demo/code/webroot;
    }
    

    参考:

    [1] https://www.toutiao.com/i6975472488293745159/
    [2] https://www.cnblogs.com/woshimrf/p/nginx-proxy-rewrite-url.html
    [3] https://blog.csdn.net/qq_34817440/article/details/100162354

  • 相关阅读:
    RichEdit
    用 RAD Studio 柏林版创建 IoT 应用程序
    延时程序
    SQL if exists用法
    Firemonkey限制TEdit只能输入数字的完美方法
    leetcode 树
    leetcode string
    clone-graph
    surrounded-regions merge-intervals
    leetcode链表题
  • 原文地址:https://www.cnblogs.com/TheoryDance/p/16246723.html
Copyright © 2020-2023  润新知