nginx proxy_pass中斜杠问题

一、location不带前缀匹配

c 复制代码
# 不带/
location / {
	proxy_pass http://192.168.1.11;
}

# 带/
location / {
	proxy_pass http://192.168.1.11/;
}

1.不带子路径

在浏览器访问

shell 复制代码
http://x.x.x.x

在日志中的显示区别。可以看出 多了一个/

shell 复制代码
"GET /"
"GET //"

返回结果是一样的

2.带子路径

在浏览器访问

shell 复制代码
http://x.x.x.x/server

在日志中的两种location 的结果是一样的

shell 复制代码
GET /server/
GET /server/

3.总结:

location和proxy_pass都是默认配置,带不带/ 访问效果都一样

二、location带前缀匹配

1.proxy_pass 不带/

c++ 复制代码
location /server {
		proxy_pass http://192.168.1.11;
}

# 浏览器访问
http://x.x.x.x/server/a
# 日志显示结果如下
GET /server/a/
    
# 也就是说nginx会把location中的url以及子路径拼接给proxy_pass 的后端地址

2.proxy_pass 带/

c++ 复制代码
location /server {
		proxy_pass http://192.168.1.11/;
}

# 浏览器访问
http://x.x.x.x/server/a

# 日志显示结果如下
GET //a/

这里可以看出,proxy_pass 带上/以后,再转发时候不会带上 location中的url(这里指的server这个url),但是后续的子路径(这里指的是/a)会拼接到porxy_pass的路径上

三、proxy_poass带后缀

有时候后端使用的tomcat,tomcat中有很多接口,也就是用很多目录区分的,这时候在转发的时候就就需要带上目录名称了。

1.location无前缀 proxy有后缀

如果是以下配置

shell 复制代码
location / {
        proxy_pass http://192.168.1.11/server;
}

访问

shell 复制代码
http://x.x.x.x/test/data

在后端日志中显示,发现test和server之间没有/隔开。所有就404了

shell 复制代码
GET /servertest/data

所以配置需要加上/,如下

c 复制代码
location / {
        proxy_pass http://192.168.1.11/server/;
}

这样结果就正确了,在后端日志中显示正常了

c 复制代码
GET /server/test/data

2.总结

proxy_pass 最后的/ 有两个作用

2.1 去掉location中的url,不做拼接,但是会拼接后续的子路径。

2.2 在路径拼接的时候,会加上一个/

相关推荐
li37149089035 分钟前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
久曲健的测试窝41 分钟前
Jenkins Share Library教程 —— 开发入门
运维·servlet·jenkins
游戏开发爱好者81 小时前
FTP 抓包分析实战,命令、被动主动模式要点、FTPS 与 SFTP 区别及真机取证流程
运维·服务器·网络·ios·小程序·uni-app·iphone
默 语2 小时前
AI驱动软件测试全流程自动化:从理论到实践的深度探索
运维·人工智能·驱动开发·ai·自动化·ai技术·测试全流程
望获linux2 小时前
【实时Linux实战系列】实时 Linux 的自动化基准测试框架
java·大数据·linux·运维·网络·elasticsearch·搜索引擎
ajax_beijing2 小时前
k8s的ReplicaSet介绍
运维·云原生
Lacrimosa&L4 小时前
操作系统概述
运维
Guheyunyi4 小时前
风险感知中枢:监测预警系统的架构与核心
大数据·运维·安全·重构·架构·自动化
东城绝神5 小时前
《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.21.5容器版集群》
linux·运维·docker·架构·consul