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

  • 时间:
  • 浏览:0
  • 来源:大发5分6合_大发5分6合官网

总而言之,就那个她 最初请求的URL必须是150之外的端口,需刚刚http://some-ip/app才都都都能否。

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

很多很多 你你你这个 措施不好。

必须问题报告 来了,我明明访问的是IP-A:Port-A,为什么我么我Nginx取到的值是150?

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

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

人太好都都都能否通过修改tomcat的代码,让它从x-forward-host/host header来取port,或者 你你你这个 不现实。

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

来讲一下那此头所有人代表那此意思。

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

近日发现有好几个 问题报告 :应用任务管理器在返回Http Redirect的刚刚 丢失了很多很多 访问 的端口。比如,亲们很多很多 访问http://IP-A:Port-A/app/delete,你你你这个 url会响应1502,或者 它返回的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的刚刚 ,你你你这个 请求从左到右贯穿了那此服务器。

必须它又是怎么知道选用那此Port的呢?你你你这个 和RemoteIPValve有关,有兴趣说说让人查阅相关文档。

关于你你你这个 逻辑让人查看Nginx Ingress的配置文件就并能知道了:

你你你这个 措施比较靠谱,刚刚将NAT Server的端口改成150就必须问题报告 了。

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

我刚刚 也写过一篇相关话题的文章《反向代理使用https协议,后台tomcat使用http,redirect时使用错误协议的避免措施》,让人看一看。

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

找有好几个 趁手的Http Request工具(我用的是Postman),记得把Follow redirect关掉,或者 模拟Nginx请求的措施(很多很多 把顶端提到的x-* header带上/添加/修改值)直接请求App Svc。

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

或者 直接访问Echo Server Svc,发现是必须顶端提到的x-*Request header的。于是怀问题报告 题报告 出在这几个header上。

顺便一提顶端的NAT Server是一台普通的服务器,亲们用它做了PAT使亲们的Nginx Ingress并能被外网访问到。

查看Nginx Ingress配置文件发现可能性最初请求的刚刚 带上x-forwarded-port说说,就并能改变它传递到顶端的值,或者 这有有好几个 问题报告 :

都都都能否推测,App利用了hostx-forwarded-*那此header来构造redirect url。

这是可能性在整个请求链路的前段:NAT Server > K8S Node > Nginx Ingress Svc 都会在第4层工作的,都都都能否认为它们干的事情都会NAT,Nginx Ingress Pod是真不知道那此服务器/网络节点的端口,或者 它必须把买车人的端口150(容器内Port)给x-forwarded-port。

顶端很多很多 讲了Tomcat是怎么构造redirect url的,但你你你这个 措施都会标准的,不同的容器有所有人的实现,毕竟Java Servlet API也必须规定怎么构造Absolute URL。