目前400错误经常出现在用户认证阶段,当一个用户从属于过多的域时,在Kerberos认证阶段会将域信息发送给服务器,从而导致请求字段长度超过服务器设置的上限。
问题重现
更改注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetserviceshttpParameters
MaxFieldLength = 10 (hex)
通过以下命令重起系统http服务 (需要管理员权限)
Net stop http
Net start http
通过以下命令重起iis服务
IISRESET
通过浏览器访问服务器网页
调试方法
400错误产生自http级别,服务器端http.sys检测到任何与其配置不符合的请求会直接回复400错误给客户端,同时在C:WindowsSystem32LogFilesHTTPERRhttperr.log文件中记录日志表明失败原因。
Http error log
#Software:Microsoft HTTP API 2.0
#Version:1.0
#Date:2012-09-05 05:01:22
#Fields:date time c-ip c-port s-ip s-port cs-version cs-method cs-uri sc-statuss-siteid s-reason s-queuename
2012-09-0505:01:22 ::1%0 20567 ::1%0 80 HTTP/1.1 GET / 400 - FieldLength
也可以通过IE Developer Tool来追踪返回代码。
打开IE, 按F12打开Developer Tool
在network选项卡上点击StartCapture按钮
浏览网页,查看返回码
解决方案
方案一
减少请求中发送的字段长度,使其符合服务器规定。如果该问题是因为该用户加入了过多域组,那就要从一些组中退出来以减少请求长度。
方案二
更改服务器设置,在注册表中更改MaxFieldLength和MaxRequestBytes设置的大小。
具体应该设为多大呢?
可以根据这个链接提供的方式计算token的大小http://support.microsoft.com/kb/327825
然后把MaxFieldLength和MaxRequestBytes的大小设置为token大小的4/3。
如果不想计算,可以安装一个fiddler在客户端,清IE cache,然后发送一个请求然后查看统计信息。一共发送了多少字节可以通过以下方式来查看。
方案三
改用NTLM取代Kerberos认证方式,这样域组信息不会被发送,但是这要根据实际环境需求而定,如果需要用到Kerberos delegation功能,肯定不能改为NTLM。另外Kerberos相对NTLM是一种更为安全的认证方式,所以该方案在选择的时候要更加慎重。
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级