首页 > 其他分享 >关于处理HTTP Get请求ULR过长导致报400错误码的问题

关于处理HTTP Get请求ULR过长导致报400错误码的问题

时间:2023-07-29 11:25:08浏览次数:48  
标签:HTTP 请求 IIS Get URL 错误码 400 Microsoft

运行环境:

Win11,VS 2022

现象:使用swagger,Postman 发起一个GET请求,返回:HTTP Error 400. The request URL is invalid.  另外 Response Headers 中显示 Server:Microsoft-HttpApi / 2.0

原因:是由于Get请求的URL字符串长度过长,导致 HTTP.sys服务拦截并终止。

解决方案:

在注册表项:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 下面新增 UrlSegmentMaxLength参数 值设置为512(不一定是这个数,根据情况来,也没研究这个最大是多少)

操作步骤:

1.按Win+R键,打开运行窗口

2.输入 regedit ,点击确定 打开注册表编辑器

3.在注册表编辑器里面找到 "计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters"目录

4.看下右侧有没有“UrlSegmentMaxLength”这个参数,有的话修改以下值,没有的话,右键空白的地方,新建-DWORD(32位)值,名称改为“UrlSegmentMaxLength” 数值数据填写 512 基数选“16进制” 

5.以管理员身份运行“命令提示符”,输入 net stop http 命令 ,按Enter键,然后输入net start http 按Enter键 (这个过程可能http service会卡死,我重启电脑了)

注:关于注册表这几个操作的意思,我不懂,但是我这样改了就可以了,大家酌情参考!

参考信息:

下面是我的处理过程,不重要……

正在学习一个开源项目AdminNet, 在跑源代码的时候,发现一个接口报400错误码,看图!

身为一个资深CV码农,当然看见这个URL就觉得挺离谱的,毕竟老师当时说过,Get请求有长度限制!,于是乎我打开百度 Bing,搜索了一下关于Get请求长度限制相关的信息,大概结果是这样的:

 来源:GET请求方式的长度限制到底是多少?

这结果远比我认知的GET牛逼啊,能传这么多字符呢? 我看了我的URL,绝对没有超过这个长度…没办法了,去技术群里面找大佬吧……

于是就把图1,发到技术群里面。果然,先来的是鄙视……什么token放url里面了,难道不知道url传不了这么多数据吗…巴拉巴拉… (这他妈的也是我不愿意去技术群提问题的原因)

后来有个老伙计,发了一张图,说他那边没问题……看图:

 

这起码证明了以下几个事情:

1.接口没问题!

2.URL确实可以这么长!

3.我本地环境有问题!

所以,换个电脑吧……于是把代码放到另一台电脑上跑了一下,结果看图:

竟然可以跑通……但这时候依然比较懵,为啥嘞?完全没有思路…咋整,再问问呗。于是去另一个技术群里面请教大佬!

 注意!重点来了,大佬提到了web服务器。。。我好像在看swagger请求返回数据的头信息(Response headers)里面看到了一个Server!!!(可以翻翻上面的图片)

于是仔细对比出错的和正常的两个返回信息,发现报400错误的返回结果里面 server:Microsoft-HttpApi / 2.0 ,而请求正常的电脑上面server:Kestrel(这里有一定的运气成分,因为另一台电脑是mac,所以默认跑代码的时候用的是Kestrel)

接下来就看了下我的vs,发现确实是用IIS Express 跑的,换成 Kestrel就好了!(这里就不贴图了,毕竟正确的页面千篇一律,错误的方式千奇百怪……)

理论上到这里就结束了,但是作为一个资深CV码农,请注意!是资深!!!显然不能满足于此! 我要让他再iis 上面也能跑!

于是继续Bing……IIS配置url请求长度限制

搜索的结果,概括一下大致分为以下两种处理方式

1.修改webconfig文件

<configuration>

	<system.webServer>
		<security>
			<requestFiltering>
				<requestLimits maxAllowedContentLength="1073741824" maxQueryString="40800" maxUrl="40800" />
			</requestFiltering>
		</security>
	</system.webServer>	
	<system.web>
		<httpRuntime maxRequestLength="999999999" maxQueryStringLength="2097151" />
	</system.web>
</configuration>

2.修改IIS服务器配置

步骤:

1.打开IIS管理器

2.点击左侧网站(或者最顶级服务器名称)

3.找到中间功能页面的“请求筛选”功能,双击进入

4.在最右侧找到操作栏目,点击“编辑功能设置”

5.在弹出的页面中,修改请求限制的各项参数(允许最大的内容长度,最大URL长度,最大查询字符串)

6.确定,重启IIS服务。

 

然而,依照上面的方式配置完成以后,依然400!!!(这里不排除有些同学的电脑,到这一步设置以后就可以了,但是我的电脑……不行)

 

这可咋整???此时我的状态……

 

突然,脑子灵光一闪!!!我出错的时候不是用的IIS Express吗?为什么前端显示我的Server是Microsoft-HttpApi / 2.0 ????这Microsoft-HttpApi / 2.0 是个什么东西???

然后继续Bing一下……Microsoft-HttpApi / 2.0  400 ,嘿!巧了,还真有命中的……

IIS的GET请求返回Microsoft-HttpApi / 2.0 | 码农家园 (codenong.com)

按照这篇文章的说法,是前端发发送的请求因为不符合规则(什么规则,我怎么不知道?规则不是我定的么……)被Http.sys给拦截了,于是改了一下注册表(修改方法在文章顶部)! 终于我的IIS也能接收这么长的Url了,而且返回的头信息里面 Server 也变成了Microsoft-IIS/10.0(为什么变得 ,我也不知道……)

至此问题处理完成!

 

另外补充一个官方文档(这个我没有尝试,有兴趣的朋友可以试一试):

HTTP 400 对 HTTP 请求的错误响应 - Internet Information Services | Microsoft Learn 

 

标签:HTTP,请求,IIS,Get,URL,错误码,400,Microsoft
From: https://www.cnblogs.com/pengfeif/p/17589503.html

相关文章

  • Oracle数据库DB_NAME、SERVICE_NAME、SID、INSTANCE_NAME、DB_UNIQUE_NAME的区别 转
    Oracle数据库DB_NAME、DBID、DB_UNIQUE_NAME、SERVICE_NAME、SID、INSTANCE_NAME、GLOBAL_DATABASE_NAME的区别DB_NAME:①是数据库名,长度不能超过8个字符,记录在datafile、redolog和controlfile中②在DataGuard环境中DB_NAME相同而DB_UNIQUE_NAME不同③在RAC环境中,各个节点的DB_......
  • apue.3e遇到的编译问题(recipe for target 'badexit2' failed)以及ls1.c案例测试
    APUE(慢慢啃这本书)编译问题,网上获得的前辈方法,本地测试可行,仅作记录。1.系统环境2.下载解压tar-zxvf*.tar.gzcd./apue.3emake报错:collect2:error:ldreturned1exitstatusMakefile:31:recipefortarget'badexit2'failedmake[1]:***[badexit2]Error1m......
  • get_started_3dsctf_2016
    0x00最近持续学习栈溢出,努力熟悉各种利用方法,争取这周和下周把栈溢出这块结束发现自己的WP好久没有更新了,BUUCTF也攒了好多于是,为了让自己更进一步熟悉栈溢出攻击,温故知新,同时方便自己查找(希望不是浪费时间),WP补完计划,启动!(我可不是看了孙导的奖励临时起意的)0x01IDA分析``......
  • 龙蜥白皮书精选:面向 HTTP 3.0 时代的高性能网络协议栈
    文/高性能网络 SIG01背景概述 随着互联网特别是移动互联网的快速发展,对互联网通信协议提出了新的诉求。经过多年的发展,QUIC协议在2021年正式被IEFT标准化,成为HTTP3的标准传输层协议。QUIC是基于UDP实现的面向连接可靠有序的传输协议。相比于TCP在内核态实现,QUIC......
  • odoo Widget使用大全
    odoo中有众多原生的widget,覆盖了很多使用场景,可惜的是odoo官方并未整理出一份使用文档.本章将根据实际使用情况来对常见的诸多widget的使用方法集中介绍一下.已知的可用Widget列表float_timemany2manyattendeemany2many_tagsone2manyemailmail_followersmail_threadm......
  • AJAX - 创建 XMLHttpRequest 对象
      AJAX-创建XMLHttpRequest对象AJAX(异步JavaScript和XML)是一种在Web应用程序中创建快速动态更新的技术。使用AJAX,Web应用程序可以异步地向服务器发送和接收数据,而无需刷新整个页面。AJAX广泛用于Web应用程序中,包括社交媒体,电子商务,在线游戏等等。XMLHttpRequest是A......
  • Android之Widget  Frame…
        2AppWidget Framework2.1定义    (1)AppWidgetService是框架的的核心类,是系统service之一,它负责widgets的管理工作。加载,删除,定时事件等都需要AppWidgetService的处理。开机自启动的。     ......
  • android网络通信之HTTP协议教程实…
    在现在的开发和应用中,网络通讯是必不可少的。虽然还是比较怀念小时候,抱着一台95在那里玩单机游戏玩的天昏地暗的时光,但是,现在,就算一个幼儿园的小盆友如果问你要手机玩游戏,突然发现居然买不了冰激凌草莓果汁什么的去喂talkinggina,或者切出一个超爆的水果分数却传不到网上去炫......
  • Visual Studio Code -- 配置https
    安装liveserver插件默认OpenwithLiveServer是http,如果想用https访问,进行一些设备权限授权才能查看页面功能的时候还是需要配置一下,这样不需要每次都上传服务器:Setting-->输入liveserver-->Editinsetting.json进行配置也可以在项目目录中创建.vscode/setting.......
  • java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
    环境信息:JDK17、Tomcat10问题原因我这里编译,打包都是好的,但是一运行发现就报错。错误的原因是Tomcat10里也自带了一些lib包,可以打开Tomcat下lib文件夹,这又涉及到了包的加载顺序了一打开发现Tomcat里的是 JakartaEE,我Maven里引用的还是JavaEE导致的。JavaEE的servlet......