1. 程式人生 > >記解決一次“HTTP Error 400. The request URL is invalid”的錯誤

記解決一次“HTTP Error 400. The request URL is invalid”的錯誤

cat 2.0 get run 情況 -i tle 錯誤信息 重啟

今天將圖片服務切到使用了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服務才能生效

  1. 依次單擊“開始”、“運行”,鍵入 Cmd,然後單擊“確定”。
  2. 在命令提示符處,鍵入 net stop http,然後按 Enter。
  3. 在命令提示符處,鍵入 net start http,然後按 Enter。

然後重啟IIS。再試一下,ok了,不報錯了,完美解決,在解決問題的過長中,領導給予了不少支持,實際情況不像本文描述的這麽簡單平凡!

記解決一次“HTTP Error 400. The request URL is invalid”的錯誤