Nginx反向代理之巨坑underscores_in_headers

一、背景

因为项目需求,在做Windows的相关的事情;基本架构就是Nginx–> Nginx –> IIS,在Linux机器上通过Nginx做反向代理到Windows的IIS;然后遇到的问题直接使用IIS的IP访问是没有任何问题的;只要通过Nginx的反向代理总会有部分会报错;报错具体如下:

1)表面错误

Server Error, unsaved changes may have been lost, please reload the page before you continue.

2)浏览器检查报错

Nginx反向代理之巨坑underscores_in_headers

3)应用层的具体日志报错如下

"fe8491dc-8dd1-49f2-8339-1dc3863b2280" host="aaaaaa" type="System.Web.Mvc.HttpAntiForgeryException" 
message="The required anti-forgery form field "__RequestVerificationToken" is not present." source="System.Web.WebPages"
detail="System.Web.Mvc.HttpAntiForgeryException (0x80004005): The required anti-forgery form field "__RequestVerificationToken" is not present.
at System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken)
at System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext, String cookieToken, String formToken)
at SunGard.AvantGard.Web.Infrastructure.AntiForgeryHelper.Validate()
at SunGard.AvantGard.Web.Infrastructure.UseAntiForgeryTokenOnPostByDefault.OnActionExecuting(ActionExecutingContext filterContext)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.InvokeActionMethodFilterAsynchronouslyRecursive(Int32 filterIndex)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.InvokeActionMethodFilterAsynchronouslyRecursive(Int32 filterIndex)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass7_0.<BeginInvokeActionMethodWithFilters>b__0(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase1.Begin(AsyncCallback callback, Object state, Int32 timeout) <br>at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeActionMethodWithFilters(ControllerContext controllerContext, <br>IList1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters, AsyncCallback callback, Object state)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.<BeginInvokeAction>b__0(AsyncCallback asyncCallback, Object asyncState)
"
user="aaaaaa" time="2021-09-03T09:56:15.1925032Z" statusCode="500">

二、排查过程

1)直接使用IP行,加上Nginx的代理就是不行,说明肯定是Nginx的哪些配置有问题

2)通过浏览器的检查,发现直接返回错误就是400,Bad request;于是把网上所有关于400的可能给排除了,还是不行

3)因为对Windows的服务确实很少用,也没想着去看的应用日志;直到最后才想办法找到他的应用日志,发现了上面的问题

4)在Nginx的配置文件里加上underscores_in_headers on配置后,解决。

三、根本原因

请求的请求头参数有下划线,而Nginx代理默认会把header中参数有”_”下划线的参数去掉;解决这个问题只需要在Nginx的配置文件中添加: underscores_in_headers on;重启Nginx即可。在上面的这个问题中,就是因为Cookies的参数里有两个参数是带有下划线的,因此每次请求Nginx都会把这两个参数当作无效参数去掉,导致每次请求都需要认证,因此就会报上面的错误第一条。

四、总结

1)在做设计时就要考虑不要用下划线做请求头

2)作为SRE层面,排查一定要根据日志来,程序有问题一定是有证据的,不能只靠猜测;要去找到可靠的证据来验证自己的猜想。 日志、日志、日志,重要的事情说三遍,绝对是你排查第一需要看的,自己就是因为思想上有一定的懒惰,没有直接第一时间去看应用日志,而是一直盯着浏览器返回的错误在排查导致排查时间过长。

3)排查问题从上到下,从下到上要适当的灵活变动;不能只停留在表层错误去排查问题,应用的日志是最能体现问题的。

五、学习交流

欢迎大家关注我的公众号,一起交流、学习。

Nginx反向代理之巨坑underscores_in_headers

Original: https://www.cnblogs.com/lemon-le/p/15229164.html
Author: Captain_Li
Title: Nginx反向代理之巨坑underscores_in_headers

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543641/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 31.使用计时器,分析服务端recv的性能

    服务端: 使用计时器,计时每秒钟调用了多少次recv,收到了多少数据包。recv每次接收1个字节。 客户端:使用计时器,计时每秒钟调用了多少次send函数。 调整客户端的线程数,客…

    Java 2023年5月30日
    068
  • (转) MySQL中的意向锁

    详解 MySql InnoDB 中意向锁的作用 posted on2022-09-29 21:54 茶倌 阅读(9 ) 评论() 编辑 Original: https://www….

    Java 2023年6月8日
    081
  • 教你win7系统手动导入注册表获取管理员权限

    想必大家都遇到过win7系统手动导入注册表获取管理员权限的问题吧,大多数朋友还不知道怎么处理固然处理起来也不难,然而还是有一些小伙伴不明白win7系统手动导入注册表获取管理员权限应…

    Java 2023年5月30日
    093
  • Mybatis学习笔记

    MyBatis 框架 MyBatis 框架 前言 第一章 框架的概述 1.三层架构 2. 三层架构请求的处理流程 3. 为什么要使用三层? 4. 三层架构模式和框架 5 .框架 6…

    Java 2023年6月5日
    059
  • day41-网络编程03

    Java网络编程03 5.UDP网络通信编程[了解] 5.1基本介绍 类 DatagramSocket和 DatagramPacket[&#x6570;&#x636…

    Java 2023年6月15日
    084
  • NGINX转发端口后却跳转到80端口的解决方法

    问题原因: nginx没有正确的把端口信息传送到后端,没能正确的配置nginx,下面这行是关键 proxy_set_header Host $host:$server_port; …

    Java 2023年5月30日
    071
  • 云原生系列5 容器化日志之EFK

    上图是EFK架构图,k8s环境下常见的日志采集方式。 日志需求 1 集中采集微服务的日志,可以根据请求id追踪到完整的日志; 2 统计请求接口的耗时,超出最长响应时间的,需要做报警…

    Java 2023年6月8日
    0202
  • Java虚拟机之内存区域

    相对于C/C++C程序员,Java程序员会相对轻松一些,因为Java虚拟机的内存管理机制会管理内存,不需要开发人员手动进行内存管理,也不容易出现内存泄露和内存溢出的。但如果不了解虚…

    Java 2023年5月29日
    071
  • java AWT 图片查看器

    java AWT 图片查看器 1 package io.guanghe; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 i…

    Java 2023年5月29日
    096
  • hdfs常用shell命令

    1、创建文件夹 hadoop fs -mkdir [-p] … path 为待创建的目录 -p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录。 …

    Java 2023年6月5日
    083
  • IDEA超级好用的插件推荐

    IDEA超级好用的插件推荐 以下都是本人使用idea开发以来,所使用过的插件,强烈推荐,提升代码质量,事半功倍之首选!!! 先介绍下如何安装这些插件:(本人使用idea的版本是20…

    Java 2023年6月15日
    084
  • Nginx笔记

    文档可以参考淘宝的: 安装(CentOs7): /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http:/…

    Java 2023年5月30日
    059
  • Bootstrap相关方法,事件整理

    相关方法 这些方法的调用方法主要是 $(‘#bsTableTest’).bootstrap(”,) 常用的方法有以下: 获取表格的一些基本属性,返回一个 object, key有…

    Java 2023年6月9日
    079
  • EasyExcel使用心得

    &#x6700;&#x8FD1;&#x9879;&#x76EE;&#x4E2D;&#x7528;&#x5230;&#…

    Java 2023年6月13日
    073
  • Spring 配置了过滤扫描Bean

    按注解过滤 @ComponentScan(value = "com.icemomo" ,excludeFilters =@ComponentScan.Filte…

    Java 2023年6月7日
    084
  • [概念]认证、授权、鉴权和权限控制

    1、认证(identification) 指的是, 根据声明者所特有的识别信息,确认声明者的身份。认证方式有很多,举例来说: 用户 + 密码 用户手机:二维码、短信、手势密码等 用…

    Java 2023年6月5日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球