首页 > 系统相关 >Nginx的proxy_pass url 反向代理的配置

Nginx的proxy_pass url 反向代理的配置

时间:2022-10-23 14:35:38浏览次数:46  
标签:访问 url Nginx xx api proxy pass location

说到 Nginx 就不得不说 Nginx 的反向代理是多么的好用,一个指令 proxy_pass 搞定反向代理,对于接口代理、负载均衡很是实用,但 proxy_pass 指令后面的参数很有讲究。

网上有很多什么绝对路径、相对路径的说法,其实在实际的应用中就分为两种情况:

url 只是 host

这里指不包含 $uri ,如:

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

这时候 location 匹配的完整路径将直接透传给 url ,如:

// 访问:   /                               后端:   /
// 访问:   /api/xx                         后端:   /api/xx
// 访问:   /api/xx?aa                      后端:   /api/xx?aa
location / {
    proxy_pass http://node:8080;
}

// 访问:   /api/                           后端:   /api/
// 访问:   /api/xx                         后端:   /api/xx
// 访问:   /api/xx?aa                      后端:   /api/xx?aa
// 访问:   /api-xx?aa                      后端:
location /api/ {
    proxy_pass http://node:8080;
}

// 访问:   /api/                           后端:   /api/
// 访问:   /api/xx                         后端:   /api/xx
// 访问:   /api/xx?aa                      后端:   /api/xx?aa
// 访问:   /api-xx?aa                      后端:   /api-xx?aa
location /api {
    proxy_pass http://node:8080;
}

url 包含路径

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

  • http://host - x
  • https//host/ - √
  • http://host:port - x
  • https://host:port/ - √
  • http://host/api - √
  • http://host/api/ - √

当 proxy_pass url 的 url 包含路径时,匹配时会根据 location 的匹配后的链接透传给 url ,注意匹配后就是这样:

 
location 规则访问的原始链接匹配之后的路径
location / /  
location / /a a
location / /a/b/c?d a/b/c?d
location /a/ /a/  
location /a/ /a/b/c?d b/c?d

 

 

 

明白匹配之后的路径后,在 proxy_pass url 包含路径时,将会把匹配之后的路径透传给 url ,如:

   
// 访问:   /                               后端:   /
// 访问:   /api/xx                         后端:   /api/xx
// 访问:   /api/xx?aa                      后端:   /api/xx?aa
location / {
    proxy_pass http://node:8080/;
}

// 访问:   /api/                           后端:   /
// 访问:   /api/xx                         后端:   /xx
// 访问:   /api/xx?aa                      后端:   /xx?aa
// 访问:   /api-xx?aa                      未匹配
location /api/ {
    proxy_pass http://node:8080/;
}

// 访问:   /api                            后端:   /
// 访问:   /api/                           后端:   //
// 访问:   /api/xx                         后端:   //xx
// 访问:   /api/xx?aa                      后端:   //xx?aa
// 访问:   /api-xx?aa                      后端:   /-xx?aa
location /api {
    proxy_pass http://node:8080/;
}

// 访问:   /api/                           后端:   /v1
// 访问:   /api/xx                         后端:   /v1xx
// 访问:   /api/xx?aa                      后端:   /v1xx
// 访问:   /api-xx?aa                      未匹配
location /api/ {
    proxy_pass http://node:8080/v1;
}

// 访问:   /api/                           后端:   /v1/
// 访问:   /api/xx                         后端:   /v1/xx
// 访问:   /api/xx?aa                      后端:   /v1/xx
// 访问:   /api-xx?aa                      未匹配
location /api/ {
    proxy_pass http://node:8080/v1/;
}

由以上规则可以看出,当 proxy_pass url 中包含路径时,结尾的 / 最好同 location 匹配规则一致。

当 proxy_pass 遇到正则

当 location 以正则形式匹配时,proxy_pass 就不能以 / 结束了,也就是不能包含路径了,比如错误的:

 
location ~* ^/api/ {
    proxy_pass http://host/;
}

location / {
    if ($uri ~* ^/api/) {
        proxy_pass http://host/;
    }
}

解决办法就是把链接中的路径去掉。

 

重写代理链接 - url rewrite

当原始链接(浏览器访问的链接)和代理服务器链接规则不一致时,可以使用 Nginx URL Rewrite 功能去动态的重写,如:

location ~* ^/api/ {
    rewrite ^/api/(.*) /?path=$1 break;
    proxy_pass http://node:8080;
}

以上请求会把匹配 /api/ 的链接重写为 /?path= 的链接透传给 node:8080 服务,有意思的是当使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:

 
// 访问:   /                               后端:   /node/
// 访问:   /api                            后端:   /node/api
// 访问:   /api/                           后端:   /?path=
// 访问:   /api/a/b/c                      后端:   /?path=a/b/c
location / {
    rewrite ^/api/(.*) /?path=$1 break;
    proxy_pass http://node:8080/node/;
}

 

标签:访问,url,Nginx,xx,api,proxy,pass,location
From: https://www.cnblogs.com/CnKker/p/16818495.html

相关文章

  • 安装nginx中的一些坑
    这个问题是openssl的问题。解决问题的网址:https://blog.csdn.net/qq_39720249/article/details/84655501一些小问题。通过注释源文件......
  • Python: Proxy Pattern
     DuProxy.py#代理模式ProxyPatternfromabcimportABCMeta,abstractmethodimportabcimportrandomclassISubject(metaclass=ABCMeta):"Aninterface......
  • URLDNS链
    1.前言URLDNS利用链是反序列化中较为简单的一条,但利用效果是只能触发一次dns请求,而不能去执行命令。比较适用于漏洞验证这一块,而且URLDNS这条利用链并不依赖于第三方的类,......
  • (数据科学学习手札145)在Python中利用yarl轻松操作url
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在诸如网络爬虫、web应用开发等场景中,我们需要利......
  • 通过地址查看nginx管理下的视频403
        最近服务器上要保存一些视频,上传成功后通过nginx在公网查看,发现nginx报403,。查询资料后发现是nginx对文件没有权限导致的,对指定视频配置读取权限后依然403,进......
  • nginx代理mysql访问
    配置stream的前提,需要启用--with-stream--with-stream_ssl_module自己单独独立一个conf 文件时不成功,最后放到nginx.confhttp 里,怎么配置也不成功,后来只能拿到http外面......
  • 102-nginx配置集群,负载均衡
    vinginx.conf在#gzipon;之后添加:upstreamorg.tonny.balance{server127.0.0.1:8081weight=1;se......
  • 爬虫基础知识(web前端,请求模块urllib,重构user_agent)
    ✅个人主页:​​hacker_demo的51CTO博客......
  • CentOS 7 环境下部署 Nginx 服务
    sudosetenforcePermissivesudovim/etc/selinux/configSELINUX=permissivesudosystemctlstopfirewalld.servicesudosystemctldisablefirewalld.service......
  • 为什么vue3要选用proxy,好处是什么?
    提问Object.defineProperty()和proxy的区别?为什么vue3要选用proxy,好处是什么?proxyProxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋......