K8S Ingress环境下,Http Redirect端口丢失问题

  • 时间:
  • 浏览:1
  • 来源:uu快3IOS下载_uu快3app下载_和值

这是将会在整个请求链路的前段:NAT Server > K8S Node > Nginx Ingress Svc 都有在第4层工作的,都不需要 认为它们干的事情都有NAT,Nginx Ingress Pod是我想知道那些服务器/网络节点的端口,而是它不需要 把被委托人的端口3000(容器内Port)给x-forwarded-port。

朋友的部署情况表是原先的:

近日发现一个难题:应用多线程 在返回Http Redirect的随后 丢失了原先访问 的端口。比如,朋友原先访问http://IP-A:Port-A/app/delete,你你什儿 url会响应3002,而是它返回的Response header Location里丢失了端口,正确的结果应该是原先:http://IP-A:Port-A/app/index,但返回的却是:http://IP-A/app/index,把端口丢失了。

随便说说以上而是都有服务器,其涵盖一个K8S Service都有服务器,它们是VIP,关于你你什儿 请看K8S - Using Source IP一文,当访问http://IP-A:Port-A/app/delete的随后 ,你你什儿 请求从左到右贯穿了那些服务器。

Tomcat的org.apache.catalina.connector.Response的toAbsolute法子 负责构造Absolute URL。

服务器信息:

查看Nginx Ingress配置文件发现将会最初请求的随后 带上x-forwarded-port说说,就不需要 改变它传递到里边的值,而是这二个难题:

找一个趁手的Http Request工具(我用的是Postman),记得把Follow redirect关掉,而是模拟Nginx请求的法子 (而是把里边提到的x-* header带上/加进/修改值)直接请求App Svc。

没得它又是怎样才能知道确定那些Port的呢?你你什儿 和RemoteIPValve有关,有兴趣说说随后查阅相关文档。

朋友使用随后 提到过的Echo Server来观察透过Ingress访问Echo Server时传递给Echo Server的Request header:http://IP-A:Port-A/echo-server,得到了那些有趣的Request header:

注意,前一个是事实标准,MDN有收录,x-forwarded-portx-original-uri似乎是私有扩展。

事实上,将会你直接访问K8S Node说说(NodePort法子 ),也是要将NodePort设置为3000,记得前面说的吗?Nginx Ingress无法知道上层NAT的端口。

在Java Servlet API中,在描述HttpServletResponse#sendRedirect的随后 提到,其返回的URL时需是Absolute URL。

什么都 你你什儿 法子 不好。

总而言之,就没得你最初请求的URL不需要 是3000之外的端口,时需是http://some-ip/app才都不需要 。

我随后 也写过一篇相关话题的文章《反向代理使用https协议,后台tomcat使用http,redirect时使用错误协议的补救法子 》,随后看一看。

使用Nginx Ingress提供的Proxy redirect annotations,将Location的值做文本替换。

而是直接访问Echo Server Svc,发现是没得里边提到的x-*Request header的。于是怀疑难题出在这好多个header上。

随便说说都不需要 通过修改tomcat的代码,让它从x-forward-host/host header来取port,而是你你什儿 不现实。

都不需要 推测,App利用了hostx-forwarded-*那些header来构造redirect url。

你你什儿 法子 比较靠谱,而是将NAT Server的端口改成3000就没得难题了。

本文转自中文社区-K8S Ingress环境下,Http Redirect端口丢失难题

结果发现x-forwarded-port是Response header Location的关键,即将会x-forwarded-port=Port-A说说,Location就会带上正确的端口。

里边而是讲了Tomcat是怎样才能构造redirect url的,但你你什儿 法子 都有标准的,不同的容器有其他人的实现,毕竟Java Servlet API也没得规定怎样才能构造Absolute URL。

来讲一下那些头其他人代表那些意思。

没得难题来了,我明明访问的是IP-A:Port-A,为什么我Nginx取到的值是3000?

关于你你什儿 逻辑随后查看Nginx Ingress的配置文件就不需要 知道了:

顺便一提里边的NAT Server是一台普通的服务器,朋友用它做了PAT使朋友的Nginx Ingress不需要 被外网访问到。