301 Перенаправление с символами Юникода - C # - PullRequest
2 голосов
/ 16 февраля 2011

Мне нужно сделать редирект 301 для URL, который может содержать символы Unicode.

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, чтобы протокол не был закодирован.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Вам нужно взглянуть на RFC 3490 , в котором подробно описано, как правильно кодировать международные доменные имена - поэтому также, когда вы кодируете только часть домена, она работает только в Chrome)

1 голос
/ 16 февраля 2011

Так что я нашел почти 100% решение этой проблемы.Спасибо Роуланду Шоу и Рупу за то, что они указали мне направление IDN.

Я попытался использовать IdnMapper, функция которого GetAscii будет преобразовывать доменные имена юникода в punycode, но у меня не было домена, отделенного от остальныхURL.Я попытался поместить URL в объект Uri, но я получил бы UriFormatException, если в URL были символы Юникод.

Это привело меня к: http://msdn.microsoft.com/en-us/library/system.uri(v=VS.90).aspx

, который говорит, как включить UriКласс для принятия Unicode и преобразования IDN и IRI.В нем говорится, что вам нужно что-то добавить в файл .NET 2.0 machine.config, но вы можете поместить строку в web.config, и она будет работать.

После того, как я получил Uri, работающий с юникодом, я собрал воедино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.Я все еще пытаюсь решить эту проблему и обновлю здесь, если найду решение.

...