IIS 10如何移除传入请求中的User-Agent头部以解决400错误?
解决IIS中重复User-Agent头导致400错误的方法
注意:IIS碰到重复请求头时会直接返回400,常规URL重写规则根本跑不起来——因为请求还没到重写环节就被IIS提前拦截了。下面是几个可行的临时解决方案:
方案一:用ARR代理请求(推荐)
ARR(Application Request Routing)能在IIS解析请求前接管处理,刚好能解决这个问题:
- 先安装ARR模块:可以通过IIS管理器的“管理模块”入口,或者用Web平台安装程序搜索安装
- 启用ARR代理:打开IIS管理器,点击服务器节点,找到“Application Request Routing Cache”,右侧操作栏点“Server Proxy Settings”,勾选“Enable proxy”
- 创建URL重写规则,把请求转发到本地(相当于自己代理自己),顺便处理重复头:
- 进入站点的URL重写模块,添加空白规则
- 匹配规则:URL填
(.*),匹配范围选“Matches the Pattern”,用正则表达式 - 操作选“Rewrite”,重写URL填
http://localhost/{R:1}(如果站点用了自定义端口,要加上,比如http://localhost:8080/{R:1}) - 切换到“Server Variables”标签,添加
HTTP_USER_AGENT,设置值为{HTTP_USER_AGENT},同时勾选“Replace”——ARR在代理时会自动合并重复的User-Agent头,只保留一个有效条目
- 保存规则后测试请求即可
方案二:自定义HTTP模块
如果不想用ARR,自己写个简单的HTTP模块也能搞定,它会在IIS解析请求头之前介入:
先写C#代码编译成DLL:
public class RemoveDuplicateUserAgentModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += HandleBeginRequest; } private void HandleBeginRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; var requestHeaders = app.Context.Request.Headers; var userAgentValues = requestHeaders.GetValues("User-Agent"); if (userAgentValues != null && userAgentValues.Length > 1) { requestHeaders.Remove("User-Agent"); // 这里可以选择取第一个值,或者合并所有值,按需调整 requestHeaders.Add("User-Agent", userAgentValues[0]); } } public void Dispose() { } }
然后在站点的web.config里注册这个模块:
<system.webServer> <modules> <add name="RemoveDuplicateUserAgentModule" type="你的命名空间.RemoveDuplicateUserAgentModule, 你的程序集名称" /> </modules> </system.webServer>
注意:这个模块需要IIS运行在集成模式下,经典模式可能需要调整配置。
方案三:修改注册表(应急用,不推荐)
这个是全局设置,会影响所有站点,风险较高,仅作为临时应急:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters - 新建DWORD值
AllowDuplicateHeaders,设置值为1 - 重启HTTP服务:打开命令提示符,运行
net stop http && net start http
注意:此方法可能引发其他兼容性问题,非必要别用。
内容的提问来源于stack exchange,提问作者martinoss
相关产品推荐
相关产品推荐

