当前位置: 首页 > Linux

Nginx反向代理的巨坑underscores_in_headers

时间:2023-04-07 00:34:16 Linux

一、背景因为项目需要,在做windows相关的东西;基本架构是Nginx-->Nginx-->IIS,我在Linux机器上使用Nginx作为WindowsIIS的反向代理;那么直接使用IIS的IP访问就没有问题了;只要经过Nginx的反向代理,部分地方就会报错;错误详情如下:1)SurfaceerrorServerError,未保存的更改可能已经丢失,请重新加载页面再继续。2)浏览器检查报错3)应用层具体日志报错如下.HttpAntiForgeryException"message="所需的防伪表单字段“__RequestVerificationToken”不存在。source="System.Web.WebPages"detail="System.Web.Mvc.HttpAntiForgeryException(0x80004005):所需的防伪表单字段“__RequestVerificationToken”不存在。

在System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBasehttpContext,IIdentity身份,AntiForgeryTokensessionToken,AntiForgeryToken); 在System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBasehttpContext,字符串cookieToken,字符串formToken)

在SunGard.AvantGard.Web.Infrastructure.AntiForgeryHelper.Validate()

在SunGard.AvantGard.Web.Infrastructure.UseAntiForgeryTokenOnPostByDefault.OnActionExecuting(ActionExecutingContextfilterContext)

在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.InvokeActionMethodFilterAsynchronouslyRecursive(Int32filterIndex)

在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.InvokeActionMethodFilterAsynchronouslyRecursive(Int32filterIndex)

在System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass7_0.b__0(AsyncCallbackasyncCallback,对象asyncState)

在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.Begin(AsyncCallback回调,对象状态,Int32超时)

在System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeActionMethodWithFilters(ControllerContextcontrollerContext,IList`1过滤器,ActionDescriptoractionDescriptor`2,IDiction参数,AsyncCallback回调,对象状态)

在System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.b__0(AsyncCallbackasyncCallback,ObjectasyncState)"user="aaaaaa"time="2021-09-03T09:56:15.1925032Z"statusCode="500》>二、排查过程1)直接使用IP线路,加上Nginx的proxy,但是不行,说明肯定是Nginx的配置有问题2)通过浏览器的检查,是发现直接返回错误是400,Badrequest;于是我在网上排除了所有400的可能,还是不行。应用日志;直到最后才找到方法找到他的applicationlog,发现上面的问题4)在Nginx的配置文件中的configuration中添加underscores_in_headers后解决,header中带“_”下划线的参数会被去掉;解决这个问题只需添加:underscores_in_headers转到Nginx配置文件;重新启动Nginx。在上面的问题中,是因为Cookies的参数中有两个带下划线的参数,所以Nginx每次请求Nginx时,都会将这两个参数作为无效参数去掉,这就需要对每次请求进行鉴权,所以就是上面的第一个错误会被举报。4.总结1)在设计的时候,一定要考虑不要使用下划线作为请求头;2)作为SRE级别,调查必须基于日志。程序问题一定要有证据,不能光凭猜测;我们必须找到可靠的证据来验证你的猜想。日志,日志,日志,重要的事情说三遍,肯定是你查的时候最??先要看的,因为脑子有一定的懒惰,一开始没有直接去看应用日志时间,却一直盯着浏览器返回的错误,导致排查时间过长;3)排查问题应自上而下、自下而上适当灵活变化;您不能只停留在表面来解决问题,应用程序日志最能反映问题。