在我的Ubuntu部署服务器上,只有当请求来自Microsoft Edge或Internet Explorer时,Nginx才会删除自定义请求标头(令牌)。来自Firefox,Chrome或Safari的请求工作正常。
我已经完成了一个tcpdump来检查传入请求之间的区别,并且请求看起来完全一样(只有User-Agent不同,这似乎正常)。所有浏览器都将令牌发送到nginx
因为我的标题包含下划线,所以我在nginx.conf中有
行underscores_in_headers on;
我正在nginx的访问日志中记录标题,它显示所有浏览器,但IE。
Nginx使用gunicorn代理Python Flask应用程序。在Flask应用程序中,我立即记录传入的请求,如果浏览器是IE,则令牌消失。所以显然nginx在将它发送给gunicorn之前丢弃了标题。
任何可能导致此问题的建议。
答案 0 :(得分:0)
TLDR:您是否使用WAF?也许将WAF作为服务?
我建议您调查整个基础架构/路由拓扑。您可能没有考虑到路径中的负载均衡器/事物。
在我的工作中,我们确实遇到了同样的问题,而您的帖子是互联网上唯一听起来像我们的问题的事情。我们最终找出了根本原因。
从DNS路由的角度来看,这是我们拓扑的简化版本:
newwebsite.company.com-> Web应用程序防火墙即服务(如果失败,则失败,无法打开)-> Nginx +(带有WAF插件)-> Kubernetes Nginx Ingress Controller->托管在其上的自定义Angular Javascript前端Nginx Pod
legacywebsite.company.com-> F5负载平衡器-> Windows IIS Web服务器。
(新网站的一部分使用了旧版网站的相同后端服务器,如果使用Chrome开发者工具,则会看到500个错误。
我们检查了IIS日志,发现带有下划线的标头已从客户端HTTP请求b4中剥离,它们将到达后端IIS服务器/我们发现必须向每个Nginx负载均衡器添加underscores_in_headers on;
在路径上,并固定它! ...或者我们认为。事实证明,除Internet Explorer / Microsoft Edge之外,所有浏览器的问题均已解决。 (您的实际情况)
疯狂的事情是,如果您位于新站点的一个url路径上,该站点会将流量转发到旧站点的负载均衡器,那么您正在经历大量的负载均衡器。 (托管Angular Javascript前端的nginx pod会将您重定向到F5负载平衡器)。我们发现了消除过程的根本原因,从而以最少的测试就摆脱了路由中疯狂的负载均衡器。我编辑了newwebsite.company.com的主机文件,以绕过WAF即服务,并直接指向充当WAF的Nginx + LB,它开始工作,IE / Edge不再出现500个错误。
我们的理论是,我们的WAF即服务正在剥离带有下划线的HTTP标头(Win IIS Web服务器使用该标头),而他们只是针对Edge / IE剥离此HTTP标头。因此,我们获得了一张票,说明了可再现性的情况和方向。