本地IIS可识别Ajax请求,生产服务器识别失败的原因问询
我在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

