ASP.NET MVC: перенаправление с параметров строки запроса на канонический URL - PullRequest
1 голос
/ 14 апреля 2011

В моем проекте Asp.Net Mvc я хотел бы иметь красивые URL, например mysite.com/Page2, и я хочу перенаправить URL-адреса моего старого стиля (например, mysite.com?page=2) с состоянием 301, чтобы не было двух URL с одинаковым содержимым. Есть ли способ сделать это?

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

Ответы [ 3 ]

0 голосов
/ 18 апреля 2011

Ну, насколько я вижу, выполнение такого перенаправления в ASP.NET MVC может быть сложным.Вот как я это сделал:

global.asax:

        routes.Add(new QueryStringRoute());

        routes.MapRoute(null, "Article/{id}/{name}",
            new { controller = "Article", action = "View", page = 1 },
            new { page = @"\d+" }
        );

        routes.MapRoute(null, "Article/{id}/{name}/Page{page}",
            new { controller = "Article", action = "View" },
            new { page = @"\d+" }
        );

QueryStringRoute.cs:

public class QueryStringRoute : RouteBase
{
    private static string[] queryStringUrls = new string[]
    {
        @"~/Article/\d{1,6}/.*?page=\d{1,3}"
    };


    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        string url = httpContext.Request.AppRelativeCurrentExecutionFilePath;

        foreach (string queryStringUrl in queryStringUrls)
        {
            Regex regex = new Regex(queryStringUrl);
            if (regex.IsMatch(url))
            {
                long id = 0; /* Parse the value from regex match */
                int page = 0; /* Parse the value from regex match */
                string name = ""; /* Parse the value from regex match */

                RouteData rd = new RouteData(this, new MvcRouteHandler());

                rd.Values.Add("controller", "QueryStringUrl");
                rd.Values.Add("action", "Redirect");
                rd.Values.Add("id", id);
                rd.Values.Add("page", page);
                rd.Values.Add("name", name);
                rd.Values.Add("controllerToRedirect", "Article");
                rd.Values.Add("actionToRedirect", "View");

                return rd;
            }
        }

        return null;
    }


    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

QueryStringUrlController.cs:

public class QueryStringUrlController : Controller
{
    public RedirectToRouteResult Redirect(long id, int page, string name,
        string controllerToRedirect, string actionToRedirect)
    {
        return RedirectToActionPermanent(actionToRedirect, controllerToRedirect, new { id = id, page = page, name = name });
    }
}

Предполагая, что у вас есть такая маршрутизация, как в моем файле global.asax (указанном выше), вы можете создать собственный класс Route, который будет обрабатывать входящие запросы и отображать их на специальном контроллере перенаправления, который затем перенаправит их на соответствующие URL-адреса с 301государство.Затем вы должны добавить этот маршрут в global.asax до ваших маршрутов "Article"

0 голосов
/ 09 мая 2011

Если вы используете IIS 7, модуль перезаписи URL должен работать для вашего сценария.

0 голосов
/ 15 апреля 2011

Я не уверен, я правильно понял ваш вопрос.Кажется, ваша текущая настройка основана на этих параметрах GET (например, mysite.com?page=2).Если вы не хотите изменять это, вам придется использовать эти параметры дальше.Там не будет никаких проблем при этом, однако.Ваши пользователи не должны использовать или видеть их.Чтобы публиковать только URL-адреса «нового стиля», вы можете настроить перенаправление URL на своем веб-сервере.Это изменило бы URL нового стиля на URL старого стиля.

Проблема в 301. Если пользователь запрашивает URL старого стиля, он также будет принят веб-сервером.Мне кажется, что трудно отклонить запрос с ошибкой 301.

Чтобы обойти это, я думаю, вам придется изменить схему параметров.Ваш сайт может по-прежнему полагаться на параметры GET, но они получают новое имя.Допустим, ваши комментарии доставляются правильно для следующего (внутреннего) URL-адреса в старой схеме:

/Article/1022/Ms-Sharepoint-Setup-Manual?newpage=2

Обратите внимание на новое имя параметра.На своей корневой странице (или главной странице, если вы их используете) вы можете обрабатывать перманент перенаправления (301) вручную.Таким образом, входящие «запросы старого стиля» различаются по старым именам параметров.Это можно использовать для ручной сборки кода 301 в ответе в коде ASP.

Лично я бы сказал, что отказался бы от идеи 301 и просто использовал перенаправление URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...