首页 > 解决方案 > IIS 页面 URL 重写给出 HTTP 错误 400,参数字符串长度超过 260 个字符

问题描述

我的环境如下:

IIS 版本为 10.0.17763.1 在 Windows Server 2019 数据中心上运行

在远程服务器上,我有一个在端口 8041 上运行的休息服务器(作为 Windows 服务),它接受带有 http 的调用。我创建了一个在端口 9010 上运行的 IIS 网站,该网站通过重定向到在 8041 端口上运行的服务的 https 域重写调用,反之亦然。我可以分别访问这两种服务,并且它们在以下情况下都可以正常工作:

在 8041 端口上运行的服务:

http://:8041/rest/AccountModule/GetUserSettings/<超过260个字符的参数字符串>

http://:8041/rest/AccountModule/GetUserSettings/<小于 260 个字符的参数字符串 https://:9010/rest/AccountModule/GetUserSettings/<小于 260 个字符的参数字符串>

在端口 9010 上运行的网站:

https://:9010/rest/AccountModule/GetUserSettings/<小于260个字符的参数字符串>

但是以下情况不起作用:

**https://:9010/rest/AccountModule/GetUserSettings/<参数字符串长度超过 260 个字符 https://:9010/rest/AccountModule/GetUserSettings/<参数字符串长度少于 260 个字符>

**

该调用给出以下错误:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>```

I have tried many things such as configuration editor changes in IIS increase the limits maxRequestLength, maxUrlLength and maxQueryStringLength and adding new DWORD values to the registry files (Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters). They are as follows and none of them seems to work. 

[IIS-Configuration-Editor-Changes][1]
[Registry_Changes_Http][2]


my web config file content is as follows:


    <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:8041/{R:1}" logRewrittenUrl="true" />
                </rule>
            </rules>
        </rewrite>
    <security>
      <requestFiltering allowDoubleEscaping="true">
        <requestLimits maxAllowedContentLength="50000000" maxUrl="6000000" maxQueryString="6000000">
                    <headerLimits>
                    </headerLimits>
                </requestLimits>
      </requestFiltering>
    </security>
    </system.webServer>
    <appSettings>
        <add key="httpRuntime" value="maxUrlLength" />
    </appSettings>
    <system.web>
        <httpRuntime maxRequestLength="50000" useFullyQualifiedRedirectUrl="true" maxUrlLength="50000" maxQueryStringLength="50000" />
    </system.web>
</configuration>

Help on fixing this long URL parameters (longer than 260 characters) is much appreciated.

Thanks
Dan


  [1]: https://i.stack.imgur.com/q82p6.png
  [2]: https://i.stack.imgur.com/xIoRq.png

标签: iisiis-10

解决方案


这些配置更改完成后,需要重启http服务才能生效:

  1. 在搜索栏中运行命令提示符
  2. 在命令提示符下,键入net stop http,然后按Enter
  3. 在命令提示符下,键入net start http,然后按Enter

我注意到您的某些参数的值没有设置为最大值,您可以尝试以下配置参数:

  1. 修改httpRuntime节点添加maxQueryStringLengthmaxRequestLength配置:

    <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>
    

根据微软的链接,您可以在注册表中修改以下两个值:

在此处输入图像描述

的设置UrlSegmentMaxCount同上,值也是Dword 2048。


推荐阅读