Могу ли я избежать этого постоянного перенаправления для исправления или добавления слага?

Я пишу веб-сайт на MVC 4 и хотел бы частично продублировать стиль Stack Exchange для вопросов маршрутизации. Например:

stackoverflow.com/questions/15191392 и
stackoverflow.com/questions/15191392/not-the-real-title и
stackoverflow.com/questions/15191392/can-i-avoid-this-redirect-to-fix-or-add-a- слизняк

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

Это моя текущая реализация:

routes.MapRoute("Item", "{id}/{slug}/{action}",
                new {controller = "Item", action = "Index", slug = UrlParameter.Optional},
                new { id = @"\d+", slug = @"(?-i)[-a-z]*", action = @"(?-i)(|[A-Z][a-zA-Z]*)" });
routes.MapRoute("Default", "{controller}/{action}/{id}",
                new {controller = "Home", action = "Index", id = UrlParameter.Optional});

In ItemController.cs:

public ActionResult Index(int id, string slug = null)
{
    var item = GetItem(id);
    var itemSlug = ToSlug(item.Title);
    if (slug != itemSlug)
    {
        return RedirectToActionPermanent("Index", new {id, slug = itemSlug});
    }
    return View(item);
}

Меня беспокоит перенаправление, если слаг неправильный / отсутствует. Эта реализация может потребовать вдвое больше работы (запрос элемента по идентификатору и вставка заголовка), чем необходимо для преобразования в представление. Что еще хуже, мне нужно дублировать код перенаправления для каждого из моих действий.

Есть ли лучшая реализация, которую я могу использовать в отношении дублирования кода, производительности и воздействия на SEO?


person dlras2    schedule 03.03.2013    source источник
comment
Вы должны сохранить слаг в базе данных, потому что, если заголовок изменится, вы хотите, чтобы URL-адрес остался прежним. Кроме того, ToSlug может измениться.   -  person usr    schedule 04.03.2013
comment
@usr, видимо я недостаточно внимательно прочитал. Я предположил, что слаг был в БД.   -  person Dave Alperovich    schedule 04.03.2013
comment
@usr Зачем мне нужно, чтобы слизняк оставался прежним? Разве смысл пули не информационный? Старые URL-адреса по-прежнему будут работать, но будут постоянно перенаправлены на URL-адрес с новым слагом.   -  person dlras2    schedule 04.03.2013
comment
По причинам SEO и потому, что URL-адреса должны идентифицировать ресурс, а не изменяться. Вам не нужно несколько URL-адресов для одного и того же объекта (хотя это работает). Я считаю URL-адрес первичным ключом.   -  person usr    schedule 04.03.2013
comment
@usr Я только что подтвердил, что при изменении заголовка вопроса в SE изменяется и заголовок вопроса. Я знаю, что SE очень внимательно относился к эффективности SEO, чего бы это ни стоило.   -  person dlras2    schedule 04.03.2013
comment
Ну, золотой стандарт - идентифицировать страницу просто по слагу и вообще не иметь никакого номера в URL-адресе. В этом случае вам определенно нужен уникальный стабильный слаг.   -  person usr    schedule 04.03.2013
comment
Я много работал с SEO. как за многие сотни часов. Если URL-адрес вообще изменится, вы потеряете, по крайней мере, повторную настройку Google. и часто вы делите сок Google между диапазоном возможных URL-адресов. В идеале вам нужно решение, в котором боты видят только 1 URL.   -  person Dave Alperovich    schedule 04.03.2013


Ответы (1)


просто внедрите теги rel = "canonical" для своих страниц ... это в любом случае хорошо, потому что по умолчанию Google рассматривает ваш простой домен и версию www как 2 разных сайта, но это поможет вам здесь, потому что Google распознает все дубликаты, которые вы можете отображать на самом деле все копии одной канонической версии (я бы использовал формат хороших ярлыков), и любые ссылки, которые созданы для любого из дубликатов, будут зачислены на правильный красивый URL, и это будут те, которые они показывают в результатах поиска страницы

подробнее о теге и его реализации можно узнать здесь: http://support.google.com/webmasters/bin/answer.py?hl=ru&answer=139394

person Carter Cole    schedule 10.04.2013