文章出處

在博客程序的日志中經常會出現這樣的錯誤日志:

Url: http://www.cnblogs.com/cmt/p/sokcet_memory_leak.html (這個URL僅是示例)
UserAgent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
System.Web.HttpException (0x80004005)
在 System.Web.CachedPathData.ValidatePath(String physicalPath)
在 System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

從錯誤內容看,應該是請求的URL路徑不對,可是通過Request.Url.AbsoluteUri記錄的URL又是正確的,讓人丈二和尚摸不著頭腦。

這個問題存在已久,之前選擇了默默地忍受。今天又看到這個錯誤,突然覺得甚是煩人,不想再忍受,于是決定查出問題真相,并將之消滅。

。。。

在Stackoverflow上的一個回答中找到了解決方法:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

原來在默認情況下,ASP.NET會對請求的URL路徑進行檢查,如果不符合要求,就會拋出System.Web.HttpException (0x80004005)異常。

而我們遇到的問題場景是URL以空格結尾(%20),不符合ASP.NET的URL路徑驗證規則,于是拋出異常,并返回500錯誤。但是ASP.NET在拋出異常的同時,會自作聰明地將空格從路徑中去掉,從而造成Request.Url得到的是去掉空格的URL,產生了誤導信息,給分析問題形成了干擾。

對于文中開頭的日志內容,Googlebot實際請求的URL是:http://www.cnblogs.com/cmt/p/sokcet_memory_leak.html%20。只要將relaxedUrlToFileSystemMapping設置為true,就能避開ASP.NET的URL路徑合法性檢查,讓ASP.NET直接返回404錯誤。

然后可以通過URL重寫,將錯誤的URL重定向至正確的URL,500錯誤轉身變成了301重定向。URL重寫規則示例如下:

<rule name="html_url_fix" enabled="true" stopProcessing="true">
    <match url="([^.]+\.html)[^?#]+" />
    <action type="Redirect" url="{R:1}" />
</rule>

既然用了URL重寫,是不是可以不用多此一舉——加relaxedUrlToFileSystemMapping="true"?但事實證明這樣是不可取的,如果不加,訪問時不會自動進行跳轉,而是顯示下面的頁面:

這不知道是ASP.NET還是IIS干的勾當,為什么要出現這樣不友好的提示頁面,這里就不進行探查了。

所以,消滅這個問題的完美解決方法是:relaxedUrlToFileSystemMapping="true" + URL Rewrite。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()