nginx 之 proxy_pass 接口转发的规则

参考文章:nginx 之 proxy_pass 接口转发的规则

1、proxy_pass 只是HOST

proxy_pass 只是HOST,不包含任何路径,比如

* http://host - √
* https://host - √
* http://host:port - √
* https://host:port - √
* http://host/ - x
* http://host:port/ - x

这种情况下,会把匹配到的所有路径直接穿透转发。比如以下的配置

location /api/ {
    proxy_pass http://127.0.0.1:3000;
}

访问 http://127.0.0.1:80/api/cc , 后端请求的地址是/api/cc

2、proxy_pass 包含路径

这里的路径哪怕只是一个 / 也是存在的,如:

这种情况下,url 里面会 去掉 location 匹配的字符串,拼接到 proxy_pass 再进行转发。

location /api/ {
    proxy_pass http://127.0.0.1:3000/;
}

访问 http://127.0.0.1:81/api/cc , 后端请求的地址是/cc

3、重写代理链接 - url rewrite

使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:

server {
    listen  83;
    location / {
        rewrite ^/api/(.*) /fixpath=$1 break;
        proxy_pass http://127.0.0.1:3000/node/;
    }
    
    location ^/api/ {
        rewrite ^/api/(.*) /fixpath=$1 break;
        proxy_pass http://127.0.0.1:3000/node/;
    }
}

访问 http://127.0.0.1:83/bb/cc 得到的请求地址是/node/bb/cc (匹配上 / 了,没有匹配 rewrite)

访问 http://127.0.0.1:83/api/cc 得到的请求地址是/fixpath=cc (我们写的 proxy_pass http://127.0.0.1:3000/node/ 里面的 node 路径丢失了 )

其它示例:

location ~ ^/smx/(test|production) {
    rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
    proxy_pass http://localhost:8181;
}

location ~ ^/es/(test|production) {
    rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
    proxy_pass http://localhost:9200;
}

4、更多

在github上看到的这本小书 :arrow_down:

(参考资料)[ https://xuexb.github.io/learn... ]

我的 nginx 配置

events {
}
http {
    # proxy_pass url 只是 host
    # 这时候 location 匹配的完整路径将直接透传给 url ,如:
     server {
            listen       80;
            
            location / {
                proxy_pass http://127.0.0.1:3000;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000;
            }
           
            
        }
    # url 包含路径
    # 当 proxy_pass url 的 url 包含路径时,匹配时会根据 location 的匹配后的链接透传给 url ,注意匹配后就是这样:
     server {
            listen       81;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000/;
            }
            location /bpi/ {
                proxy_pass http://127.0.0.1:3000/v1;
            }
            location /cpi {
                proxy_pass http://127.0.0.1:3000/v1;
            }
        }
        # 当 location 以正则形式匹配时,proxy_pass 就不能以 / 结束了,也就是不能包含路径了, 会提示配置错误,比如错误的:

     server {
            listen       82;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }
        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /test.conf:47
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/;
        #     }

        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /Users/tangdaoyuan/code/anheng/jz-bingjiang/test.conf:52
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/b1;
        #     }
        }

    # 使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:
     server {
            listen       83;
            location / {
                proxy_pass http://127.0.0.1:3000/node/;
            }
            location ^/api/ {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
        }

}

测试流程 : node 运行 服务, 启动 Nginx 转发 , 再用postman 发送请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值