Читабельность URL и проблема дублирования контента (ASP.NET) - CodeHelper

Читабельность URL и проблема дублирования контента (ASP.NET)

2

Как известно, если URL содержит ключевые слова, то это положительно влияет на ранг соответствующей страницы и лучше воспринимается пользователем. То есть вместо url

http://somesite.ru/category.aspx?id=13

лучше использовать

http://somesite.ru/category/13/текстовое-описание-категории

При таком способе текстовое описание с ключевыми словами не несет смысловой информации и используется только для улучшения привлекательности URL. Но, из этого следует, что такое описание может быть изменено клиентом или вовсе отсутствовать, и сервер выдаст одну и ту же страницу при следующих запросах:

http://somesite.ru/category/13/текстовое-описание-категории
http://somesite.ru/category/13/другое-текстовое-описание-категории
http://somesite.ru/category/13/

Такое поведение может быть воспринято поисковыми системами как дублирование контента со всеми вытекающими. Как бороться с этой проблемой?

Лучший ответ:

2

Самый очевидный способ — использование перенаправлений (redirect) всех некорректных адресов на один корректный. Этот способ не только устранит дублирование контента, но и поможет перенести «ссылочную ценность» на одну страницу. Для перенаправления используется статусы HTTP 30x. В нашем случае идеально подойдет статус "301 Moved Permanently", сообщающий клиенту (поисковику, браузеру и т.п.), что запрашиваемый ресурс следует загрузить с другого адреса.

Вообще, перенаправления (redirect) можно настроить на уровне IIS, используя решение типа ISAPI_Rewrite. Также инструменты подмены URL (UrlRewriter.NET, UrlRewriting.NET) могут выполнять перенаправления. Но в нашем случае такие способы не годятся, потому что модуль, осуществляющий redirect должен иметь связь с базой данных или другим хранилищем сущностей. Иначе адрес вида http://somesite.ru/category/13/ не удастся преобразовать к http://somesite.ru/category/13/текстовое-описание-категории. Итак, единственное решение — вручную написать код, осуществляющий redirect в случае отличия текущего URL от корректного. Такой код обычно жестко связан с конкретной предметной областью, поэтому сложно привести общий пример. Для ASP.NET код может выглядеть так:

public static class UrlHelper
{
    public static void CheckUrlcanonical()
    {
        HttpContext context = HttpContext.Current;
        string currentLocation = context.Request.Path.ToLower();
        string canonicalLocation = GetCanonicalLocation()      1;
        if (currentLocation != canonicalLocation)              2
        {
            context.Response.Status = "301 Moved Permanently"; 3
            context.Response.AddHeader("Location", canonicalLocation)
        }
    }
}

1 — метод GetCanonicalLocation возвращает канонический адрес для запрашиваемой страницы, возможно, обращаясь к слою доступа к данным или сервисам.

2 — проверяем, является ли текущей адрес каноническим

3 — осуществляем redirect — устанавливаем статус 301 и путь для перенаправления.

Метод UrlHelper.GetCanonicalLocation() можно вызывать в обработчике Page_Load() соответствующей страницы или глобально для всего приложения — в Global.asax (Application_BeginRequest())

Новые ответы


1

Можно воспользоваться элементом link с rel="canonical" для указания канонического (предпочитаемого) адреса страницы:

<link rel="canonical" href="http://somesite.ru/category/13/текстовое-описание-категории">

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

Такой подход отлично сработает для всех (или большинства) заморских поисковиков, но наши поисковики (в частности Яндекс) не воспринимают rel="canonical".


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.