.. / XHTML+XSLT = SEO (о валидном NOFOLLOW и инвалидном NOINDEX )

  1. seo

Введение

В области поисковой оптимизации возникают специфические задачи с манипуляцией HTML. Наиболее распространенные - сокрытие текстов от поисковых машин, запрет на учет роботами определенных ссылок.

Основная проблема в решении этих задач - несогласованность решений предлагаемых различными поисковыми машинами, несоответствие этих решений стандартам w3c, необходимость использования JavaScript.

Например конструкции, запрещающий индексацию части текста и неучитывающая ссылки при передаче PR:
<noindex> текст запрещенный к индексации в Yandex и Rambler,</noindex>
<a href="http://url.com" rel="nofollow"> неучитываемая в Google ссылка</a>

Поддерживаются одними поисковыми машинами и не поддерживаются другими.

Еще одной проблемой в поисковой оптимизации является необходимость перемещения определенных блоков текста и заголовков ближе к началу HTML. Но решение этой задачи через CSS не всегда возможно.

Решение всех этих задач было возможно благодаря внедренной еще в Microsoft Internet Explorer 5.0. технологии преобразования XHTML+XSLT. В настоящий момент основные альтернативные браузеры так же поддерживают эту технологию.

Решения

Все что написано ниже не представляет интереса для тех, кто хоть немного разбирается в XSLT-технологии, потому что все приведенные примеры тривиальны. Скорее это рассчитано на тех, кто слышал что такое бывает, но плохо представляет возможности использования XSLT.

1. Сокрытие текста от роботов (альтернатива noindex)

Результат работы посмотреть (здесь). Ниже приведен код исходного XHTML в котором часть текста закомментирована и результат наложения XSLT трансформации, в которой комментарий раскрывается. В этом случае скрытый текст спрятан от всех поисковых машин, и отсутствует noindex, вызывающий нарекания со стороны ревнителей стандартов.

Исходный XHTML

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="1.xsl"?>   
<html>   
<head>   
</head>   
<body>   
 Index it! </body>   
</html>   
</html>           

XSLT

<?xml version="1.0" encoding="windows-1251"?>   
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">   
  <xsl:output method="html"/>   
  <!-- Идентичное преобразование в следующих примерах будет подключено через include -->   
  <xsl:template match="*">   
  <xsl:copy>   
  <xsl:apply-templates/>   
  </xsl:copy>   
 </xsl:template >   


<xsl:template match="div">   
<div>       

<xsl:value-of select="comment()"/>   
<xsl:value-of select="."/>   
</div   >   
</xsl:template  >   
</xsl:stylesheet  >   
            

Трансформация HTML+XSLT

<html>
<head>   
</head>   
<body>   
NoIndex it! Index it!
</body>   
</html>   
</html>           

К сожалению, снятие комментариев с фрагментов текстов, содержащих теги не представляется возможным из-за некооректной работы всех броузеров - FF, Opera, MSIE/ (см. пример
Для обхода этой досадной ошибки текст не подлежащий индексации можно вставлять не в XHTML, а в XSLT. В этом случае в исходном XHTML он будет отсутствовать даже в виде комментариев и не останется в снипетах поисковых машин (копиях страниц, сохраняющихся в поисковых машинах).

2. Сокрытие ссылки от роботов (альтернатива rel="nofollow" и JS)

Для того чтобы ссылка не учитывалась в ссылочном ранжировании Google ввел атрибут ссылки rel="nofollow". Но этот атрибут не поддерживается российскими поисковыми машинами. Для того, чтобы упрятать ссылку от роботов приходится ее маскировать java-скриптами типа:
<a href="#" title=http://google.ru onmouseover="this.href=this.title"> Gooogle!</a>

Предлагаемый вариант на XSLT прячет нежелательные ссылки от обоих поисковых машин. Результат работы и исходный код можно посмотреть здесь.
В этом примере в исходном XHTML ссылка на сайт http://x9.ru отсутствует. XSLT преобразовывает содержимое тега span в ссылку, присваивая ей адрес указанный в параметрах span.

Исходный XHTML

<?xml-stylesheet type="text/xsl" href="ex2.xsl"?>
<html>   
<head>   
<title>       No follow</title>   
</head>   
<body>   
<div>   
<span title="http://x9.ru">       No follow!! It's no link. It's span </span>   
</div>   

            </body>   
            </html>   
            

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>   
<xsl:include href="copy.xsl"/>   


<!-- преобразование span в href -->   
<xsl:template match="span">   
<a href="{@title}">       <xsl:value-of select="."/>       </a>   
</xsl:template>       
</xsl:stylesheet>   
            

Трансформация HTML+XSLT

<html>
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
<title>       No follow</title>   
</head>   
<body>   
<div>   
<a href="http://x9.ru">       No follow!! It's no link. It's span </a>   
            </div>         </body>   
            </html>   
             

Здесь так же приведем пример расширенный пример нескольких вариантов экранирования ссылки без применения опции rel="nofollow" и java-скриптов

3. Произвольная перестановка блоков

Этот пример скорее всего потерял акткуальность, но во времена, когда свободное владение CSS считалось чем-то выдающимся, размещение ключевых слов ближе к началу HTML-кода позволяло получить бонусы в ранжировании страниц по релевантности. Во всяком случае таке мнение бытовало на SearchEngines.Ru еще 2-3 года назад. Впрочем, если немного пофантазировать, возможно этому приему можно будет найти другое применение. Ну хотя бы для манипуляций в стиле css Zen Garden

Результат работы и исходный код можно посмотреть здесь.
В этом примере блоки div расположены в произвольном порядке. XSLT преобразование выводит их в браузер в порядке значения title. Если такое нецелевое использование атрибута title не нравится, можно использовать любые другие атрибуты.

Исходный XHTML

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="ex2.xsl"?>   
<html>   
<head>   
</head>   
<body>   
22222222222
55555555555
77777777777
44444444444
66666666666
33333333333
11111111111
55555555555
</body>   
</html>   
</html>           

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>   
<xsl:include href="copy.xsl"/>   
<!-- сортировка div -->   
<xsl:template match="body">   
<body>   
<xsl:apply-templates select="div">   
<xsl:sort select="@title"/>   
</xsl:apply-templates>   
</body>   
</xsl:template>   
</xsl:stylesheet>           

Трансформация HTML+XSLT

<html>
<head>   
</head>   
<body>   
11111111111
22222222222
33333333333
44444444444
55555555555
55555555555
66666666666
77777777777
</body>             

4. Предупреждение для пользователей устаревших браузеров.

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

Рабочий пример приведен здесь, тексты ниже:

Исходный XHTML

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="ex4.xsl"?>   
<html>   
<head>   
</head>   
<body>   
Wow! Fine design!  But You can't enjoy. Your must update your browser!  </body>   
</html>            

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>   
<xsl:include href="copy.xsl"/>   
<!-- убираем с показа span -->   
<xsl:template match="span"/>   
</xsl:stylesheet>   
            

Трансформация HTML+XSLT

<html>
<head>   
</head>   
<body>   
Wow! Fine design!
</body>   
</html>            

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

Вопросы и проблемы

Как обычно у сеошников возникает Extra FAQ - "А не забанят ли меня за это". Однозначного ответа на этот вопрос как всегда нет. Вас непременно забанят по стуку, если будет потеряно чувство меры (см. комментарий к примеру 4).

Второй вопрос - как это индексируется. Яндекс и Google индексируют. И пока эта технология не получила распространение индексируют исходную страницу без XSLT преобразования. Но если технология получит распространение, поисковым машинам придется научаться индексировать преобразованные страницы. И вот тогда возникнет много новых интересных вопросов.

И напоследок о проблемах. И этих проблем много и если получится подробнее о них напишу позже..
Главная проблема в браузерах, не поддерживающих преобразование XML+XSLT. На сегодняшний день это примерно 5%. Но даже при самых больших темпах перехода на FireFox и Opera 9, 2-3% консервативных пользователей достаточно долго будут пользоваться старыми версиями браузеров.
Другая проблема заключается в необходимости настройки HTTP-заголовков и DOCTYPE под разные браузеры. Те, кто привык проверять все сайты на w3.org обнаружат в приведенных примерах вопиющую ошибку - отсутствие DOCTYPE. Но ошибки здесь нет. На вход браузера отдается не XHTML, а XML. Такое решение выбрано из-за определенных проблем с XSLT трансформацией валидных XHTML в MSIE.

UPD1

Это вторая версия сайта "Тыманчи Ыргын" В ней так же используется клиентский XSLT и умеренная манипуляция контентом. Практически это живой тест на возможности индексирования поисковыми машинами XML+XSLT. Гарантии что сайт не будет забанен в Яндексе как обычно нет.

UPD2

Кстати, в версии 1.6.3 CodeIgniter появилась утилита для выводa XML из SQL-запроса

UPD3

25.01.10 Google индексирует xslt-файл клиентсткого преобразования, но само преобразование не выполняет.

UPD4

В 2012-2013 году Google научился выполнять преобразование и индексировать весь контент. На этом тему можно считать закрытой.

  1. 2007-09-03
  2. seo
  1. ajaxian.com/archives/browser-detection-with-xslt - Browser Detection with XSLT. (Определение броузера через XSLT)
  2. www.blogovo.ru/archives/42 - Валидный NOINDEX средствами XSLT. В блоге Николая Дубровского
  3. developer.mozilla.org/en/XSL_Transformations_in_Mozilla_FAQ - XSL Transformations in Mozilla_FAQ
  4. www.seoburg.ru/2007/01/25/162/ - Инвалидный метод для валидации NOINDEX. Еще одна попытка
Go Index Test