Я конвертирую существующий классический веб-сайт ASP в (VB) MVC и не хочу, чтобы какой-либо из существующих URL-адресов ломался. Я прочитал много постов (вроде этого: Маршрутизация классических запросов ASP в .NET - SEO Redirects ) о том, как сделать правильное перенаправление 301. С последней версией MVC я понял, что
Response.RedirectPermanent(objRedirect.new_url, True)
- это все, что нужно.
Я ввел все свои старые URL в таблицу базы данных с соответствующим столбцом нового URL. Я добавил код на свою страницу 404, чтобы получить исходный URL:
Dim strURL As String = Request.RawUrl.Substring(Request.RawUrl.IndexOf("aspxerrorpath=") + 15).ToLower()
так что я могу посмотреть в базе данных. (Интересный sidenote, документация MSDN здесь - Режим перенаправления - кажется, говорит, что если я установлю RedirectMode = ResponseRewrite в разделе CustomErrors моего web.config, мне не придется беспокоиться о выполнении вышеизложенного, но когда я пробую это, я получаю ошибки IIS, говорящие, что это не будет обслуживать страницу ASP?!?!?)
Проблема, с которой я сталкиваюсь, заключается в том, что любой из моих старых, классических URL-адресов ASP, которые имеют тот же каталог, что и новый маршрут MVC, каким-то образом частично маршрутизируется. Например, «/test/default.asp» отображается как «/ test / test» в приведенной выше переменной strURL моей страницы ошибок.
У меня есть настройка маршрута для «теста»:
routes.MapRoute("Test", _
"test/{action}", _
New With {.controller = "test", .action = "index"})
в Global.aspx.vb, но я также пытался всеми возможными способами игнорировать все страницы ASP в маршрутах (по-видимому, безрезультатно). Вот попытки, которые я предпринял (я видел одну старую статью 2008 года Phil Haack , в которой говорилось, что я могу использовать только один из этих маршрутов "перехватить все", но не знаю, так ли это все еще действует или нет?):
routes.IgnoreRoute("{file}.asp")
routes.Ignore("{resource}.asp/{*pathInfo}")
routes.IgnoreRoute("{resource}.asp/{*pathInfo}")
routes.Add(New Route("{resource}.asp/{*pathInfo}", New StopRoutingHandler()))
и ни один из них, казалось, не имел никакого значения (очевидно, я попробовал их все по одному)
Он также не изолирован только для одного маршрута - он существует для любых каталогов, существующих на старом сайте, которые соответствуют именованному маршруту на новом сайте.
Заранее благодарим вас за любые ваши предложения!
ОБНОВЛЕНИЕ: Вот еще 2 "проблемы", которые я обнаружил:
- Я теряю оригинальную строку запроса. Таким образом, если запрашивается product.asp? Id = 1, все, что у меня есть на странице ошибок, это product.asp (есть идеи, как получить / сохранить исходную строку запроса?)
Еще один из моих маршрутов выглядит так:
route.MapRoute ("IndependentSales", _
"Independentsales / {действие}", _
Новое с {.controller = "independentsales", .action = "index"})
и когда я запрашиваю "/resale/default.asp", он переходит к "перепродаже / независимым продажам". Что случилось с этим ???