ASP.NET MVC Colon в URL
Я видел, что у IIS есть проблема с пропуском двоеточий в URL. Я также видел предложения, предложенные другими здесь.
На сайте, над которым я работаю, я хочу иметь возможность передавать названия фильмов, книг и т. Д. В мой URL, включая двоеточие, например:
mysite.com/Movie/Bob:The Return
Это будет поглощено моим MovieController
Например, в виде строки и используется далее по линии.
Я понимаю, что двоеточие не идеально. У кого-нибудь есть другие предложения? Каким бы бедным он ни был в настоящее время, я делаю поиск и замену всех двоеточий (:) другому символу, а затем замену назад, когда я хочу использовать его на конце контроллера.
5 ответов
Рассмотрите кодировку URL и декодирование названий ваших фильмов.
Вы бы в конечном итоге foo.com/bar/Bob%58The%20Return
В качестве альтернативы рассмотрите возможность использования помощника HTML для удаления недружественных символов URL в URL (метод URLFriendly()
). Преимущества SEO между двоеточием и заполнителем (например, тире), вероятно, будут незначительными.
Я решил эту проблему, добавив это в мой web.config:
<httpRuntime requestPathInvalidCharacters=""/>
Это должно быть в разделе system.web.
По умолчанию это:
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?"/>
Таким образом, сделать исключение только для двоеточия
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,\,?"/>
Узнайте больше на: http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx
Для того, что я понимаю, символ двоеточия является приемлемым в качестве не закодированного символа в URL. Я не знаю, почему они добавили его по умолчанию для requestPathInvalidCharacters.
Одно из самых больших опасений, связанных с вашим подходом, заключается в том, что название фильма не всегда будет уникальным (например, "Итальянская работа"). А также насчет других нелегальных символов (например, скобок и т. Д.).
Было бы неплохо использовать идентификационный номер в URL, чтобы найти фильм в вашей базе данных. Вы все еще можете включить в свой URL-адрес копию названия фильма, но вам не нужно беспокоиться о возвращении к исходному названию со всеми недопустимыми символами.
Хорошим примером является URL-адрес этой страницы. Вы можете видеть, что удаление заголовка страницы все еще работает:
Самый простой способ - использовать System.Web.HttpUtility.UrlEncode() при построении URL-адреса и System.Web.HttpUtility.UrlDecode при интерпретации возвращаемых результатов. У вас также могут возникнуть проблемы с символом пробела, если вы сначала не закодируете значение.
Двоеточие - это зарезервированный и недопустимый символ в URI согласно RFC 3986. Так что не делайте то, что нарушает спецификацию. Вам нужно либо закодировать URL, либо использовать другой символ. А вот хороший пост в блоге, на который вы можете взглянуть.