内容简介:今天上了一个多页应用,发现接口转发后是proxy_pass 如何转发,proxy_pass 只是HOST,不包含任何路径,比如
今天上了一个多页应用,发现接口转发后是 401
。 最后发现是接口转发出错了。地址里多拼了一个 路径。 以前我一直以为location 字段会替换掉 proxy_pass 里面配置的 url 地址。 今天了解了一下 发现还是有不少细节的。
// node js 文件,打印请求路径。方便查看后端真实接受到的请求地址
const http = require('http');
http.createServer((req, res) => {
console.log(req.url);
res.end(`您的 请求 地址是${req.url}`);
}).listen(3000);
proxy_pass 如何转发, 首先看 proxy_pass 的url 配置。
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
proxy_pass 包含路径
这里的路径哪怕只是一个 / 也是存在的,如:
- http://host - x
- https//host/ - √
- http://host :port- x
- https://host :port/ - √
- http://host/api - √
- http://host/api/ - √
这种情况下,url 里面会 去掉
location
匹配的字符串,拼接到 proxy_pass 再进行转发。
location /api/ {
proxy_pass http://127.0.0.1:3000/;
}
访问 http://127.0.0.1:81/api/cc
, 后端结果为 您的 请求 地址是/cc
重写代理链接 - 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
路径丢失了 )
知道了这几点,碰到转发接口也有一点底气啦~
更多
在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 发送请求。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Fluent Python
Luciano Ramalho / O'Reilly Media / 2015-8-20 / USD 39.99
Learn how to write idiomatic, effective Python code by leveraging its best features. Python's simplicity quickly lets you become productive with it, but this often means you aren’t using everything th......一起来看看 《Fluent Python》 这本书的介绍吧!