2009-12-09 40 views
5
Dim x AS New URI("http://www.example.com/test//test.asp") 
Dim rel AS New URI("http://www.example.com/xxx/xxx.asp") 
Console.Writeline(x.MakeRelativeUri(rel).Tostring()) 

正常工作在這裏的輸出是:正火URI,使其與MakeRelativeUri

../../xxx/xxx.asp 

這看起來是正確的,幾乎所有的Web服務器將處理以下兩個爲同一請求:

http://www.example.com/test//test.asp 
http://www.example.com/test/test.asp 

解決這個問題的最好方法是有沒有API來做到這一點,或者手動創建一個新的URI並刪除路徑中的所有//?

回答

4

似乎與局部路徑部分中的一個斜線替換所有多斜線是最好的解決方案。即使將URL傳遞給ASP.net,IIS也是如此。

以下代碼可以解決問題。

x = new Uri(string.Format("{0}://{1}:{2}{3}{4}", x.Scheme, x.Host, x.Port, Regex.Replace(x.LocalPath, @"(?<!\:)/{2,}", "/"), x.Query)); 
0

首先,你的代碼不是C#但是VB,所以標籤是錯誤的。

你可以使用這個代碼,它會給出「正確」的URL,因爲//在baseuri中將被丟棄嗎?

var x2 = new Uri(x, rel); 

或者在網址中獲得../回溯很重要嗎?

MakeRelativeUri函數根據RFC做了正確的修改,但是它按照常規約定失敗。我建議你自己規範網址,或者如果可能的話,使用我的例子。

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/")); 
+0

該代碼是非常粗略的黑客,因爲它不會在幾種情況下工作,最明顯的是http://example.com/test///xxx其次,即使它不能很好地編碼,這是一個仍然有效的URL:http://example.com/?bla=//Whatup – 2011-11-14 23:58:02

+0

Dr.Evil:一個有效的URL在很大程度上取決於Web服務器對它的解釋,以及它在解析URL時決定的強大程度。由於框架並不像您想要的那樣進行所有清理,因此您可以自己創建一個「makerelativeurl」函數,以適當地檢查和清理斜線。你應該遵循RFC,還是處理URL明顯錯誤的情況? 。) – 2011-11-16 18:29:15