2011-02-16 29 views
2

我需要對URL中可能包含Unicode字符的301重定向。301使用unicode字符重定向 - C#

HttpUtility.UrlEncode沒有做什麼,我需要,因爲如果我編碼整個URL它編碼的任何「:」或「/」

HttpUtility.UrlEncode("http://www.हिन्दी.com") = http%3a%2f%2fwww.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com 

(也:http://www.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com似乎並沒有在Firefox工作或IE,但它在Chrome中)

我只能想到的其他事情是編碼URL的不同部分,以便協議不被編碼。

+0

我認爲你需要在將域名傳遞給[IRI](http://www.w3.org/International/articles/idn-and-iri/)/ punycode(yuck name)之前將其編碼重定向而不僅僅是URL的編碼。 – Rup 2011-02-16 11:12:29

回答

1

於是我想出了一個幾乎100%的解決方案。感謝Rowland Shaw和Rup將我指向IDN的方向。

我嘗試使用IdnMapper,其功能GetAscii將unicode域名轉換爲punycode,但我沒有從URL的其餘部分分離域。我試圖把網址放到Uri對象中,但是如果URL有unicode字符,我會得到一個UriFormatException。

,導致我:http://msdn.microsoft.com/en-us/library/system.uri(v=VS.90).aspx

告訴如何啓用Uri類接受Unicode和做IDN和IRI轉換。它說你必須添加一些東西到.NET 2.0 machine.config文件中,但是你可以把這行放在web.config中,它會起作用。

我得到了烏里使用Unicode參加工作後,我拼湊起來的URL,做了重新定位:

Response.Clear(); 
Response.Status = "301 Moved Permanently"; 
Response.AddHeader("Location", uri.Scheme + "://" + uri.DnsSafeHost + uri.PathAndQuery + uri.Fragment); 
Response.End(); 

這適用於Chrome和Firefox 3.6,但在IE8失敗。我仍然試圖解決這個問題,如果我找到解決方案,我會在這裏更新。

+0

只有當我的重定向URL的域名是本地時纔會出現IE8錯誤。因此,重定向到IRI的http:// localhost/redirectURL將失敗,但重定向到相同IRI的http://www.example.com/redirectURL可以正常工作。奇。 – 2011-02-18 18:01:06

3

你需要看看RFC 3490詳細介紹瞭如何正確編碼的國際域名 - 這也是爲什麼當你剛編碼域部分它只能在Chrome)