Обработка устаревших URL для любого уровня в MVC

Я обновил старый php-сайт до asp.net MVC и хочу обработать все устаревшие URL-адреса. Мне не нужно, чтобы они отображались на текущие страницы, так как содержимое все новое, но я хочу перехватить все запросы на страницу.php и отправить их на домашнюю страницу (в идеале с постоянным перенаправлением для поисковых систем).

Это работает, но только на корневом уровне:

 routes.MapRoute(
             "LegacySite",                                                    // Route name
             "{OldPage}.php",                           // URL with parameters
             new { controller = "Home", action = "index" },  // Parameter defaults
             new string[] { "EatIn.Website.Controllers" }
        );

Я хочу получить все страницы.php независимо от папки, в которой они находились.

2 ответа

Решение

Уильям,

У меня похожий сценарий на старом сайте mvc 1. Тем не менее, логика может все еще соответствовать. У меня было несколько известных страниц и множество неизвестных страниц, чтобы иметь дело с. в то время я занимался этим в действии, используя довольно грубый подход, как подробно описано ниже:

public ActionResult Index()
{
    string routeval = (string)this.RouteData.Values["file"];
    var dicT = new Dictionary<string, int>();
    // oh deary me - hardcoded values
    dicT.Add("algarve", 1);
    dicT.Add("brazil", 5);
    dicT.Add("colorado", 4);
    dicT.Add("morocco", 2);
    dicT.Add("thailand", 6);
    // what, no test for culture/case :-)
    if (dicT.ContainsKey(routeval))
    {
        var routeData = new RouteValueDictionary(
            new
            {
                controller = "Property",
                action = "Details",
                id = dicT[routeval],
                Lang = "en"
            });
        return RedirectToAction("Details", "Property", routeData);
    }
    else
    {
        return View();
    }
}

[edit] - нашел еще один "полезный" бит информации об этом из старого приложения mvc1. Вы можете добавить следующее к вашему базовому контроллеру:

public class LegacyUrlRoute : RouteBase
{
    // source: http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        const string status = "301 Moved Permanently";
        var request = httpContext.Request;
        var response = httpContext.Response;
        var legacyUrl = request.Url.ToString();
        var newUrl = "";

        if (legacyUrl.Contains("/villas/") || legacyUrl.EndsWith("asp"))
        {
            if (legacyUrl.Contains("/villas/"))
                newUrl = "/en/home/Destinations";
            else if (legacyUrl.EndsWith("asp"))
            {
                newUrl = "/en/home/index";
                if (legacyUrl.Contains("about"))
                    newUrl = "/en/home/AboutUs";
                if (legacyUrl.Contains("offers"))
                    newUrl = "/en/home/Offers";
                if (legacyUrl.Contains("contact"))
                    newUrl = "/en/home/ContactUs";
                if (legacyUrl.Contains("destinations"))
                    newUrl = "/en/home/destinations";
                if (legacyUrl.Contains("faq"))
                    newUrl = "/en/home/Faq";
                if (legacyUrl.Contains("terms"))
                    newUrl = "/en/home/Terms";
                if (legacyUrl.Contains("privacy"))
                    newUrl = "/en/home/Privacy";
            }

            response.Status = status;
            response.RedirectLocation = newUrl;
            response.End();
        }
        return null;
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

и затем добавьте новый маршрут в ваш файл global.asax:

routes.Add(new LegacyUrlRoute());

в основном я "знал", что искал значение маршрута, которое содержало параметр "file" вдоль строк www.url.com/somepage.asp?file=algarve и т. д. (так работал старый классический сайт asp, и я знал, что у нынешнего такого нет). Для "известных" маршрутов, на которые я хотел перенаправить, я использовал логику, которая RedirectToAction, все остальное просто прошло через дефолт Index() View(),

Как я уже сказал, неаккуратно и не обязательно, как я это сделаю сейчас (около 2,5 лет спустя), но это был пример, который у меня был "плавающий вокруг", и это на самом деле работает!!:D

удачи

Взгляните на RouteMagic Фила Хаака - возможно, это поможет вам.

Вот запись в блоге, которая описывает перенаправление маршрута: http://haacked.com/archive/2011/02/02/redirecting-routes-to-maintain-persistent-urls.aspx

Другие вопросы по тегам