You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地IIS可识别Ajax请求,生产服务器识别失败的原因问询

生产服务器无法识别Ajax请求的X-Requested-With头的排查原因

我在MVC控制器中编写了一段代码,用于判断用户调用方法时的请求是否为Ajax请求:若为Ajax请求则返回JSON响应,否则返回安全页面的URL字符串。这段代码在Visual Studio本地IIS运行时能正常识别Ajax请求,但部署到生产服务器后,isAjax变量始终为false。浏览器网络面板显示X-Requested-With请求头已正常传递,请问出现该差异的可能原因是什么?

var isAjax = (filterContext.RequestContext.HttpContext.Request["X-Requested-With"] == "XMLHttpRequest") ||
             ((filterContext.RequestContext.HttpContext.Request.Headers != null) &&
             (filterContext.RequestContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest"));

可能的原因分析

  • 生产服务器IIS拦截了请求头:部分生产环境的IIS默认会过滤X-Requested-With这类非标准请求头,或者需要手动配置允许传递。可以检查服务器的web.config,查看<requestFiltering>节点下的<requestHeaders>是否添加了允许规则:

    <system.webServer>
      <security>
        <requestFiltering>
          <requestHeaders>
            <add name="X-Requested-With" allowed="true" />
          </requestHeaders>
        </requestFiltering>
      </security>
    </system.webServer>
    
  • 反向代理/负载均衡器剥离了请求头:如果生产环境使用了Nginx、Apache或云负载均衡服务,这些中间件可能在转发请求时丢弃了X-Requested-With头。需要检查反向代理的配置,确保它会原样转发该请求头。比如Nginx中需要添加:

    proxy_set_header X-Requested-With $http_x_requested_with;
    
  • 自定义判断逻辑存在兼容问题:你当前的判断逻辑先从Request["X-Requested-With"](从表单、查询字符串取值)再读Headers,而MVC框架本身提供了更可靠的Request.IsAjaxRequest()方法,该方法已经处理了请求头大小写、传递方式等兼容场景。生产环境中可能存在中间件修改请求头大小写的情况(比如转成小写),导致你的严格相等判断失效。

  • HTTPS环境的请求头处理差异:本地可能用HTTP协议,生产环境是HTTPS,部分服务器在HTTPS模式下会对请求头做额外的过滤或转换,需要检查服务器的SSL配置是否存在相关规则。

内容的提问来源于stack exchange,提问作者LittleB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:30:47