2011-01-14 2 views
6

Я видел, что у IIS возникла проблема с введением двоеточий в URL-адреса. Я также видел предложения, которые другие предложили here.ASP.NET MVC Colon в URL

С сайта я работаю, я хочу, чтобы иметь возможность передавать названия фильмов, книг и т.д., в мой URL, двоеточие включены, например:

mysite.com/Movie/Bob:The Return 

Это будет потребляться по моему MovieController, например, как строка и используется дальше по строке.

Я понимаю, что толстая кишка не идеальна. У кого-нибудь есть другие предложения? Так же плохо, как сейчас, я делаю поиск и замену из всех двоеточий (:) другому персонажу, а затем обратно заменяю, когда я хочу его использовать на конце контроллера.

+0

Зачем вам использовать двоеточие? Вы обнаружили, что это работает на серверах, отличных от IIS? Мне хотелось бы, чтобы двоеточие не было разрешено указывать номера портов, потому что это упростило бы анализ протокола. Используйте дефис, символ подчеркивания или другой символ. Или сделайте еще один уровень, например 'mysite.com/Movie/Bob/The + Return'. –

+0

Проблема с выполнением 'mysite.com/Movie/Bob/The + Return' будет определять, как взять название фильма (« Боб: Возвращение ») и знать« Эй, здесь был двоеточие. .. Мне нужно вернуть их обратно должным образом ». –

+0

Может быть, я должен пройти в классе, в котором есть как заголовок, так и пуля, а не только название фильма как строка? –

ответ

3

URL encoding and decoding Рассмотрим названия фильмов.

Вы бы в конечном итоге с foo.com/bar/Bob%58The%20Return

В качестве альтернативы, рассмотрим используя в HTML helper to remove URL unfriendly characters in URLs (метод является URLFriendly()). Преимущества SEO между двоеточием и заполнителем (например, тире), вероятно, будут небрежными.

+9

Я пробовал делать кодирование/декодирование. IIS все еще, казалось, видел это и сказал: «Эй, это все еще двоеточие. Бросьте ошибку 400!» –

0

Колон является зарезервированным и недопустимым символом в URI согласно RFC 3986. Поэтому не делайте то, что нарушает спецификацию. Вам нужно либо кодировать URL, либо использовать другой символ. И вот nice blog post, на который вы можете взглянуть.

+0

Где говорится, что это недействительно? Я интерпретирую это неправильно? pchar = unreserved/pct-encoded/sub-delims/":"/"@" – darkangel

0

Самый простой способ - использовать System.Web.HttpUtility.UrlEncode() при построении url и System.Web.HttpUtility.UrlDecode при интерпретации возвращаемых результатов. У вас также возникнут проблемы с символом пробела, если вы сначала не кодируете значение.

2

Одна из самых больших проблем с вашим подходом заключается в том, что название фильма не всегда будет уникальным (например, «Итальянское задание»). Также, что касается других символов ilegal (например, скобок и т. Д.).

Возможно, было бы неплохо использовать идентификационный номер в URL-адресе, чтобы найти фильм в вашей базе данных. Вы могли бы по-прежнему включать URL-адрес с URL-адресами в URL-адрес, но вам не нужно беспокоиться о возвращении к исходному названию со всеми незаконными символами в нем.

Хорошим примером является ссылка на эту страницу. Вы можете увидеть, что удаление заголовок страницы все еще работает:

ASP.NET MVC Colon in URL

ASP.NET MVC Colon in URL

+0

Это интересная идея. Я должен посмотреть на это. –

6

Я решил эту проблему, добавив в моем web.config:

<httpRuntime requestPathInvalidCharacters=""/> 

Это должно быть в пределах раздела system.web.

по умолчанию:

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?"/> 

Так только сделать исключение для толстой кишки, что стало бы

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/> 

Узнайте больше на сайте: http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx

За то, что я понимаю, двоеточие допустим как некодированный символ в URL-адресе. Я не знаю, почему они добавили его в значение по умолчанию для параметров requestPathInvalidCharacters.