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 在路径拼接的时候,会加上一个/

相关推荐
杨云龙UP12 分钟前
PostgreSQL 18.4 数据库整库迁移实战:pg_dump 备份与 pg_restore 恢复完整操作手册
运维·服务器·数据库·postgresql·pg_dump·pg_restore
无人生还别怕1 小时前
如何安装任意版本docker
运维·docker·容器
T0uken2 小时前
Colab:SSH 访问免费 GPU Server
运维·ssh
Python大数据分析@2 小时前
通过 MCP 实现 AI Agent自动化数据采集
运维·人工智能·爬虫·自动化
Initialize293082 小时前
告警一条接一条刷屏?五步治理告警风暴
运维
帷幕落秋2 小时前
Docker镜像加速
运维·docker
帷幕落秋3 小时前
Docker原理-理论基础
运维·docker
有毒的教程3 小时前
Linux底层存储路由配
linux·运维·网络
云智慧AIOps社区4 小时前
MSP 的增长瓶颈不在客户,在交付模式:人效与规模如何兼得?
运维·人工智能·自动化运维
HAHAXX84 小时前
淘宝RPA定时拉取交易数据实战:从人工录单报错到自动化对账全流程复盘
运维·自动化·rpa