详解Nginx proxy_pass的一个/斜杠引发的血案

背景

一个nginx的server模块下需要proxy到两个server,所以就通过location的不同路径来区分转发到不同的服务器上。

一开始是这么写的

location / {
   proxy_pass http://server1/;
}

location /index {
   proxy_pass http://server2/;
}

但是忘记了server1上有个服务路径是/indexNew,结果就被proxy到了server1,出现404问题,然后紧急修改配置如下:

location /indexNew {
   proxy_pass http://server1/;
}

location / {
   proxy_pass http://server1/;
}

location /index {
   proxy_pass http://server2/;
}

问题现象

结果请求是到了server1了,但是错误变成,POST not supported

{
	"status": 500,
	"message": "http://172.28.72.117/-Request method 'POST' not supported",
	"result": {}
}

这是当时应用的返回错误,查看nginx也没有报错,很奇怪,看了代码里/indexNew的确是POST方法啊,为啥报错不支持呢。

首先这里补充下location各种写法在nginx里的匹配顺序:

分析

nginx日志也没有报错,就尝试抓包,从nginx到应用的包

通过tcpdump命令抓包

tcpdump -w dataAll_normal.pcap -i eth0 -s0 port 8888

类似上述命令抓包,然后通过wireshark看,发现压根没搜索到/indexNew相关的http流量包。

尝试修改location如下

location /indexNew {
   proxy_pass http://server1;
}

location / {
   proxy_pass http://server1/;
}

location /index {
   proxy_pass http://server2/;
}

区别仅仅在于/indexNew的proxy_pass最后一个/斜杠去掉了,继续抓包,发现可以搜索到/indexNew的包

说明此次修改正确了。

继续改回错误的,尝试抓包,还是没能搜索到/indexNew的包,然后通过IDE远程debug应用

发现到了应用里的URL压根也没有/indexNew,那当然在wireshark包里搜不到了。。。

是因为nginx转发应用的时候,访问路径就只有 / 了。

而工程中请求路径为 / 的接口的确是GET方法

详细看下location中proxy_pass的语法,的确是这样,proxy_pass最后有/,会把匹配location里的路径去掉,截取后面的URL PATH进行转发。

所以这里一定要注意proxy_pass最后一个/的含义作用,要慎用,它会改变路径请求信息,而不是100%的信息转发。

到此这篇关于详解Nginx proxy_pass的一个/斜杠引发的血案的文章就介绍到这了,更多相关Nginx proxy_pass斜杠内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • nginx proxy_pass指令’/’使用注意事项

    1. proxy_pass配置说明 不带/ 复制代码 代码如下: location /test/ { proxy_pass http://t6:8300;  } 带/ 复制代码 代码如下: location /test/  {                  proxy_pass http://t6:8300/;   } 上面两种配置,区别只在于proxy_pass转发的路径后是否带 "/" 针对情况1,如果访问url = http://server/test/test.jsp,则被

  • 详解Nginx proxy_pass的一个/斜杠引发的血案

    背景 一个nginx的server模块下需要proxy到两个server,所以就通过location的不同路径来区分转发到不同的服务器上. 一开始是这么写的 location / { proxy_pass http://server1/; } location /index { proxy_pass http://server2/; } 但是忘记了server1上有个服务路径是/indexNew,结果就被proxy到了server1,出现404问题,然后紧急修改配置如下: location /i

  • 详解Python中的正斜杠与反斜杠

    首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows (一)目录中的斜杠们 python读文件需要输入的目录参数,列出以下例子: path = r"C:\Windows\temp\readme.txt" path1 = r"c:\windows\temp\readme.txt" path2 = "c:

  • 详解nginx配置location总结及rewrite规则写法

    location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这

  • 详解Nginx反向代理跨域基本配置与常见误区

    跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访问,其实是浏览器的限制.理解这一点很重要!!! 最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器.同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一些问题,在这里总结一下基本配置,也聊一下常见的配置问题. Ng

  • 详解Nginx如何配置Web服务器的示例代码

    概述 今天主要分享怎么将NGINX配置作为Web服务器,并包括以下部分: 设置虚拟服务器 配置位置 使用变量 返回特定状态码 重写HTTP响应 在高层次上,将NGINX配置作为Web服务器有一些问题需要了解,定义它处理哪些URL以及如何处理这些URL上的资源的HTTP请求. 在较低层次上,配置定义了一组控制对特定域或IP地址的请求的处理的虚拟服务器. 用于HTTP流量的每个虚拟服务器定义了称为位置的特殊配置实例,它们控制特定URI集合的处理. 每个位置定义了自己的映射到此位置的请求发生的情况.

  • 详解Nginx中的Rewrite的重定向配置与实践

    一:理解地址重写 与 地址转发的含义. 地址重写与地址转发是两个不同的概念. 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上.浏览器的地址栏也会显示www.baidu.com. 地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程. 因此地址重写和地址转发有以下不同点: 1. 地址重写会改变

  • 详解nginx 配置文件解读

    nginx配置文件主要分为四个部分: main{#(全局设置) http{#服务器 upstream{} #(负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器) server{ #(主机设置:主要用于指定主机和端口) location{}#(URL匹配特点位置的设置) } } } server继承main,location继承server,upstream即不会继承其他设置也不会被继承. 一.main 全局配置 nginx在运行时与具体业务功能(比如http服务或者email服务代理

  • 详解nginx.conf 中 root 目录设置问题

    在配置 nginx.conf 总会遇到一些问题,下面列举一些常见的问题并说明如何解决 1.相对路径的问题 例如配置文件中 location 设置 location ~ .php${ root html } location 中root所指向的html是一个相对路径,相对的是这个配置文件的路径,假设此配置文件的位置是/etc/nginx/conf.d,那么这个html的绝对路径就是/etc/nginx/conf.d/html.因此为避免出现不必要的麻烦,在配置root路径的过程中最好用绝对路径.

  • 详解nginx配置vue h5 history去除#号

    vue的默认配置是使用hash模式,这样我们访问的时候都带有了一个#号,再支付回调的地址或者其他原因不支持#号或者不喜欢#号这种模式,优势就出现了需要去除#号,于是vue端就需要配置该模式,并且使用懒加载,vue端的配置如下: 首先先声明一下,这是使用vue+nginx实现前后端分离的项目,并且使用vue axios实现代理功能(允许跨域并且服务端已经开启跨域), 然后就是打包的配置: !!!注意,这里配置的assetsPublicPath一定要配置成  "/"  而不是  "

  • 详解Nginx 502错误解决办法

    详解Nginx 502错误解决办法 1.配置错误 因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port 2.资源耗尽 lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏高,我们又没有给php-fpm配置足够的子进程,那么php-fpm就会资源耗尽,一旦资源耗尽nginx找不到php-fpm就会出现502错误, 解决方案 去调整php-fpm.conf中的pm.m

随机推荐