由于链接地址长度过长引起的”HTTP Error 400. The request URL is invalid”错误解决办法:修改注册表
Posted 武穆逸仙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于链接地址长度过长引起的”HTTP Error 400. The request URL is invalid”错误解决办法:修改注册表相关的知识,希望对你有一定的参考价值。
网站中,设计了一个批量搜索的功能,用户可以输入多个关键词进行批量查询搜索,但不出意外的话还是出意外了,有些用户可能会输入N多个关键词,我为了性能等考虑,会限制个数,比如每次批量查询仅限50个以内,但还是有意外发生,有些关键词可能会很长,即会引发”HTTP Error 400. The request URL is invalid”的错误。如图
按以前的经验呢,先检查了网站程序上的web.config文件,httpRuntime 节点下的maxUrlLength配置以及security节点下的requestFiltering》maxUrl ,
确认都以及设置过了
<httpRuntime targetFramework="4.6.1" enableVersionHeader="false" requestPathInvalidCharacters="" requestValidationMode="2.0" maxQueryStringLength="2097151000" maxUrlLength="2097151000" maxRequestLength="2097151000" relaxedUrlToFileSystemMapping="true" executionTimeout="36000" delayNotificationTimeout="36000" />
<security>
<requestFiltering allowDoubleEscaping="true" allowHighBitCharacters="true" >
<requestLimits maxAllowedContentLength="2097151000" maxQueryString="2097151000" maxUrl="2097151000" />
</requestFiltering>
</security>
还是出现”HTTP Error 400. The request URL is invalid”的错误,最后问度娘、谷歌,最终找到解决方法:修改服务器的注册表。
Http.sys Windows 的注册表设置(https://learn.microsoft.com/zh-CN/troubleshoot/developer/webapps/iis/iisadmin-service-inetinfo/httpsys-registry-windows)
可以在以下注册表项下创建以下 DWORD 注册表值:
HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\HTTP\\Parameters
注册表项 | 默认值 | 有效值范围 | 注册表项函数 | WARNING 代码 |
---|---|---|---|---|
UrlSegmentMaxCount | 255 | 0 - 16,383 段 | 最大 URL 路径段数。 如果为零,则计数受最大值的 ULONGb 约束。 | 1 |
UrlSegmentMaxLength | 260 | 0 - 32,766 chars | URL 路径段中的最大字符数 (URL) 中斜杠之间的区域。 如果为零,则由最大值限制的 ULONG长度。 | 1 |
开干!
进入注册表 CMD =》 regedit=》HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\HTTP\\Parameters
右击空白区域,选择Dword值,新建名称 UrlSegmentMaxLength,双击键名,选择十进制,值设置成2048,然后点击 确认。
同样,再新建名称 UrlSegmentMaxCount,双击键名,选择十进制,值设置成2048,然后点击 确认。
如图
需要注意的是,修改完以后不会立即生效,需重启HTTP 服务。不想那么麻烦,也可以简单粗暴一下,重复服务器即可。
若不想或不允许重启服务器,可以按如下步骤来重启HTTP服务。
重启 HTTP 服务、键入和所有相关的 IIS 服务,请执行以下步骤:
选择 “开始”,选择 “运行”,键 入 Cmd,然后选择 “确定”。
停止HTTP服务:在命令提示符处,键入 net stop http,然后按 Enter。系统提示会停止相关联的服务器,输入y 确认继续
启动HTTP服务:在命令提示符处,键入 net start http,然后按 Enter。
停止IIS服务:在命令提示符处,键入 net stop iisadmin /y,然后按 Enter。
备注:依赖于 IIS 管理员服务服务的任何 IIS 服务也将停止。 请注意停止 IIS 管理员服务时停止的 IIS 服务。 下一步将重启每个服务。
重启步骤 4 中已停止的 IIS 服务。 为此,请在命令提示符处键 net start servicename 入,然后按 Enter。 在命令中, servicename 是要重启的服务的名称。 例如,若要重启万维网发布服务服务,请键入 net start World Wide Web Publishing Service,然后按 Enter。
再来测试一下,访问正常啦!
记解决一次“HTTP Error 400. The request URL is invalid”的错误
今天将图片服务切到使用了cdn的机器上面去,然后就部分图片报如下图错误“HTTP Error 400. The request URL is invalid”
看到这种错误信息,一般的开发者心中可能会猜测到两个原因
1.链接中有特殊字符
2.链接长度过长(似乎长度过长也不是这个错,模糊不清,忘记了)
错误图片的地址如下:http://{host}/SearchService.svc/rest/pic600x320/png/kv3hcxmnCmISVvFKojNBGpkN44MRx71vV4v7Qu7ikclbic2vX5Axnm8RxwhLoWyehsSz4J%C2%A72F6h4eQgvkrbzuKGR6y7sszK1KUY75RqxylZMumapwVQttfllaSPXwoRGEeVexDqjmMZSERPquL3uLZbv6Vxdx52nRDUW90SVVYeqkHZbx2w3T1coqt2v036tfaZ%C2%A72D8GBlPbIVJuhSFU5GA8116z8FkV4%C2%A72kDtsxSXy9XTFIziTToRpbQEkp7497O6q99
接下来就开始了按照我们所能遇见的错误原因进行排查
1.查看url,并没有特殊字符(排除这个原因)
2.url咋一看确实很长,那我们删除参数的一半长度再请求。结果是可以成功,然后通过不断的加字符,发现长度超过339就报这个错,而339后面也没啥特殊字符,所以我们基本确定错误原因是应为url过长。
接下来就是解决相关问题
然后就是各种百度,查看相关修改querystring长度限制的配置
然后就修改web.config
1.修改 httpRuntime 节点下面增加 maxQueryStringLength,maxRequestLength配置
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" maxQueryStringLength="2097151" maxUrlLength="2097151" maxRequestLength="2097151" relaxedUrlToFileSystemMapping="true" executionTimeout="36000" delayNotificationTimeout="36000" />
2.修改system.webServer节点,如下
<security> <requestFiltering allowDoubleEscaping="true" allowHighBitCharacters="true" > <requestLimits maxAllowedContentLength="2097151" maxQueryString="2097151" maxUrl="2097151" /> </requestFiltering> </security>
满怀期待的保存,运行,错误依旧,好像并没有什么卵用
这个时候就开始纳闷了,为啥不行,会不会没有生效,想到这儿可能就有很多人像我一样,想到了iis的全局设置,会不会该项设置不能被覆盖,我们用的依旧是全部设置的值
不用猜测,查看一下就知道了(注意,查看的requestFiltering是位于 system.webServer下,不要看错节点了)
<section name="requestFiltering" overrideModeDefault="Allow" />
如果是关闭的,overrideModeDefault的值是Deny,Allow表示我们该配置会以我们站点具体配置为准。
那么一切都是正常的啊,为啥就是报错呢?!
最后stackoverflow上面一个没有被采纳的回到引起了我的注意
链接 https://stackoverflow.com/questions/8447698/the-request-url-is-invalid-in-iis-7
大致意思是,请求还没到iis,被操作系统干掉了。
这个时候再google上面搜到另外一篇文章,链接到了微软的光放技术支持
地址如下 https://support.microsoft.com/zh-cn/help/820129/http-sys-registry-settings-for-windows
两篇文章的大意都是我们需要修改注册表,综合两篇文章,大概修改是注册表如下两个值
接下来就试一下,进入注册表 CMD =》 regedit=》HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\HTTP\\Parameters
右击空白区域,选择Dword值,如图
新建名称 UrlSegmentMaxLength,值设置成2048,然后点击ok
UrlSegmentMaxCount的设置同上,值也是Dword 2048,点击ok.
修改完成只有重启http服务才能生效
- 依次单击“开始”、“运行”,键入 Cmd,然后单击“确定”。
- 在命令提示符处,键入 net stop http,然后按 Enter。
- 在命令提示符处,键入 net start http,然后按 Enter。
然后重启IIS。再试一下,ok了,不报错了,完美解决,在解决问题的过长中,领导给予了不少支持,实际情况不像本文描述的这么简单平凡!
以上是关于由于链接地址长度过长引起的”HTTP Error 400. The request URL is invalid”错误解决办法:修改注册表的主要内容,如果未能解决你的问题,请参考以下文章