最近定位一个以前没有注意到的奇葩问题。在系统开发过程中,在测试环境有些人反馈偶尔会出现请求应用时会重定向到后端业务微服务地址,而且还不是必现问题,有点棘手。

当前系统请求流如下:

Request --> NGINX ---> ZUUL --> Business Micro Service

即页面请求先到达暴露出来的反向代理服务器NGINX,NGINX将请求转发到ZUUL,ZUUL网管又将请求转发到实际需要处理的业务微服务。

问题的现象是在浏览器地址栏中输入请求地址(NGINX地址),页面会重定向到Business Micro Service实际的地址,而该地址不应该暴露出来。

通过浏览器调试模式下看到的请求重定向如下:

为什么请求会重定向呢?哪个环节进行的重定向呢?

Request首先经过NGINX,但是NGINX不知道具体的业务微服务地址,NGINX配置的ZUUL的地址,故NGINX配置问题应该可以排除。

经过NGINX到ZUUL,ZUUL通过Eureka能够获取到具体的业务微服务地址,故ZUUL存在重新向的嫌疑。

通过查看ZUUL官方文档,发现如下这段话:

ZUUL作为前端web应用,如果响应码为3XX时请求进行重定向的情况需要重写Request请求Header中的Location,对于这种情况可以配置LocationRewriteFilter Bean,会将Location设置为ZUUL的地址。

我们按照文档描述,定义了LocationRewriteFilter后,系统就可以了,以为这样就完美解决了。可能乐极生悲吧,后续系统功能开发过程中,发现重定向到其他系统时,系统发生了异常,重定向不过去。这时想起了文档中的Caution,某些场景不支持呀。

文档中特别提醒这种重写Location方式,不适合所有的场景,如重写向地址是外部应用地址,这时重定向会报错,不能达到业务预期。

问题又回到了起点。。。

再沉下心,不断分析,认为ZUUL应该也不是导致请求重定向的原因,因为如果是ZUUL的话,所有的请求都经过ZUUL了,所有请求都应该被重定向呀。

通过排除法,现在唯一可能就只剩下应用自己进行重定向了。

经过不断的F5刷页面,查看请求的变化,偶然注意到请求的地址与重定向的地址不仅仅IP与端口变化了,后面请求的服务路径也有区别,我们请求的地址为http://localhost:21000/business,而重定向Location地址为http://localhost:20001/business/,服务后面居然多了一个反斜杠(/)。

这时才突然想起,如果只输入context-path时应用服务器会重定向到context-path/,然后自动将index.html内容返回,进行页面加载渲染。

想明白了这个问题以后,问题的解决方法也就出来了,既然最后端的业务微服务请求需要context-path/加载页面,那我们就把重定向前移就可以解决这个问题。

于是在NGINX中增加了如下配置:

rewrite ^/business$ /business/ redirect;

这样NGINX对于请求Portal服务时如果缺少了反斜杠(/)就自动重定向了,避免最后端微服务请求自己重定向把服务地址暴露出来了。

这种提前处理也可以放到ZUUL中,自定义过滤器进行请求拦截重定向。

历时一周多的问题到此终于解决。反思一下,如果不是粗心,只关注最大的变化而忽略了细微的变化,所以在后续的开发中,不要轻易让表象蒙蔽,小心驶得万年船呀~~

本应该快速解决的问题,却由于没有抓到问题的本质,导致问题迟迟不能解决,实属不该。

浪费时间,就是浪费生命呀,血一般的教训,一个反斜杠(/)引起的血案~~

一个反斜杠(/)引起的血案相关推荐

  1. silverlight Image Source URI : 一个反斜杠引发的血案

    silverlight Image Source URI : 一个反斜杠引发的血案 Silverlight2 现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml ...

  2. java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠,该怎么解决

    2019独角兽企业重金招聘Python工程师标准>>> java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 java replaceAll() 方法要用 4 ...

  3. java替换一个反斜杠_java反斜杠替换

    java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 例如 str1="aa\bbb"; str2="aa'bbb"; 要想替换成 str ...

  4. 用正则表达式匹配网址URL中最后一个反斜杠/后面的内容

    测试内容: http://b174.photo.store.qq.com/psb?/V10CD1yE07IujV/eMbKzb1rzHY56uejjCDlOsR3hhQY53jBobTL7Zh9lUg ...

  5. 详解正则表达式匹配一个反斜杠\的问题

    $str = '\/div'; $pattern = '/\\\\\/div/'; // '\\\\\/' 解析过程如下: // PHP解析: // 第1个'\'转义第2个'\',转义后为字符串'\' ...

  6. qt如何去掉文件路径最后一个反斜杠的内容

    QString strTemp = "E:\\hell\\word\\detect.txt"    int nIndex = strTemp.lastIndexOf('\\'); ...

  7. java中linux下反斜杠,Linux下反斜杠号\引发的思考

    今天在检查home目录时发现有一个名为"\"的文件,觉得很奇怪,从来没见过,就准备用Vim打开看看,很自然地输入命令查看一下,结果居然打不开. ubuntu@ubuntu:~$ v ...

  8. linux 下反斜杠路径,Linux下反斜杠号\引发的思考

    今天在检查home目录时发现有一个名为"\"的文件,觉得很奇怪,从来没见过,就准备用Vim打开看看,很自然地输入命令查看一下,结果居然打不开. ubuntu@ubuntu:~$ v ...

  9. (正)斜杠 与 反斜杠

    在 Windows 系统中,正斜杠/ 表示除法,用来进行整除运算:反斜杠\ 用来表示目录,例如:E:\学习资料\java\传智播客_2015年Java基础视频-深入浅出精华版\day11. 在 Uni ...

最新文章

  1. mysql的字符串处理函数
  2. 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )
  3. JZOJ 5938. 【NOIP2018模拟10.30】分离计划
  4. nginx配置设置,使部分页面访问跳转到404页面
  5. python实现二分查找算法_两种方法实现Python二分查找算法
  6. python 表示图论_Python 图论工具 | 学步园
  7. IE低版本(6-9)CSS hack
  8. layui表格使用:经验总结(含案例、代码、截图)
  9. jQuery 的一个自动向上翻页的效果
  10. koa2 从入门到进阶之路 (五)
  11. erdas几何校正_实验一 ERDAS介绍与图像几何校正
  12. 【存储】存储基本概念(lun,volume,HBA,DAS,NAS,SAN,iSCSI,IPSAN、存储池和存储卷)
  13. 二极管的工作原理,什么是二极管?
  14. [转] 8 reasons why SPIR-V makes a big difference
  15. ESP8266--SDK开发(驱动WS2812B)
  16. 让流媒体服务SRS支持P2P通信
  17. 微信开发者工具报跨域问题,以及配置微信开发者工具可跨域
  18. 计算机导论(12.12)课后总结
  19. 使用Echarts完成对中国地图的绘制
  20. Android逆向之旅---破解某应用加密算法(动态调试so和frida hook so代码)

热门文章

  1. Python简单木马编写
  2. 690. Employee Importance
  3. PMI-ACP练习题(13)
  4. VScode 插件中 package.json 文件字段详解
  5. 喜马拉雅fm java开发_【android】喜马拉雅FM sdk使用
  6. Tornadao—模板语法(函数)
  7. 理解WSDL,IDL
  8. Vue项目之登录注册
  9. hdu 2006 求奇数的乘积
  10. There is no getter for property named 'depart' in 'class com.xuezhixin.mls.web.model.Major'