Ответ 1
Сначала создайте маршрут:
routes.MapRoute(
"ViewProduct",
"Products/{id}/{productName}",
new { controller = "Product", action = "Details", id = "", productName = "" }
);
Затем создайте метод Action следующим образом:
public ActionResult Details(int? id, string productName)
{
Product product = ProductRepository.Fetch(id);
string realTitle = UrlEncoder.ToFriendlyUrl(product.Title);
string urlTitle = (productName ?? "").Trim().ToLower();
if (realTitle != urlTitle)
{
string url = "/Products/" + product.Id + "/" + realTitle;
return new PermanentRedirectResult(url);
}
return View(product);
}
В основном вы сравниваете заголовок объекта в URL-адресе с тем, который хранится в базе данных, если они не совпадают, а затем выполняют постоянную переадресацию 301. Убедитесь, что он является "постоянным" перенаправлением (код статуса 301) вместо переадресации времени (302). Таким образом, поисковые системы будут рассматривать это как постоянное изменение URL-адреса и соответственно обновят свои индексы, это может произойти, если заголовок вашего объекта изменится после того, как поисковая система проиндексировала его (например, кто-то изменил название продукта).
Еще одна вещь, о которой нужно знать, если ваш заголовок позволяет использовать любой бесплатный текст, вам нужно вычеркнуть любые недопустимые для URL символы и сделать их более читабельными для людей и поисковых систем, следовательно, метод UrlEncoder.ToFriendlyUrl в приведенном выше коде реализация ниже:
public static class UrlEncoder
{
public static string ToFriendlyUrl (this UrlHelper helper,
string urlToEncode)
{
urlToEncode = (urlToEncode ?? "").Trim().ToLower();
StringBuilder url = new StringBuilder();
foreach (char ch in urlToEncode)
{
switch (ch)
{
case ' ':
url.Append('-');
break;
case '&':
url.Append("and");
break;
case '\'':
break;
default:
if ((ch >= '0' && ch <= '9') ||
(ch >= 'a' && ch <= 'z'))
{
url.Append(ch);
}
else
{
url.Append('-');
}
break;
}
}
return url.ToString();
}
}
Поэтому, когда вы выписываете URL-адреса в представлении, обязательно закодируйте заголовки с помощью этого метода, например.
<a href="/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
Я написал сообщение в блоге об этом здесь http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls