Народ в очередной раз задался вопросом, как бы так закрыть часть документа от индексации, чтоб при этом все было валидно? По мотивам статьи от Ayavryk'а сделал свой вариант.
В основе лежит ровно та же идея: отдаем на клиент документ, в котором контент, не предназначенный для индексации, спрятан в комментариях, а затем при помощи XSLT достаем его оттуда.
Основная засада заключается в том, что Mozilla Firefox не знает о disable-output-escaping, поэтому исходный метод переставал работать, если в контенте, который мы прячем, встречались вложенные теги. Собственно, эту проблему я решил черезвычайно тупо: дополнительным XSL-преобразованием на сервере.
Пусть у нас имеется (X)HTML-код, в котором некоторые блоки размечены старым добрым невалидным тегом noindex. Например, вот такой. На сервере мы должны заменить все текстовые узлы внутри noindex'ов на комментарии, а сами noindex'ы заменить на нормальные человеческие теги, каким-то образом отмеченные, чтоб на клиенте знать, что внутри них нужно обрабатывать комментарии. Я в качестве такого "маркера" использовал класс "noindex", а в качестве "человеческого тега" - div, либо если noindex[@type = 'inline'] - то span.
Собственно говоря, XSL-шаблон, через который прогоняется документ на сервере, выглядит вот так. На клиент приходит документ, в котором тег noindex заменен на div[@class = 'noindex'], а все текстовые узлы заменены на комментарии. Т.е. что-то в этом духе:
<div> Дорогой Яндекс! <div class="noindex"><!--Не индексируй меня! --><b><!--Пожа-а-а-алуйста!--></b></div> Вот этот кусок можно проиндексировать. А <span class="noindex"><!--вот этот, пожалуй, не стоит--></span>. </div>
Остается натравить на это безобразие еще один шаблон, уже на клиенте. Он совсем простой: он копирует все дерево, заменяя обратно комментарии на текстовые узлы внутри тегов с классом "noindex". disable-output-escaping я оставил для наглядности: если бы Фокс с ним дружил, можно было бы обойтись без преобразования на сервере.
Клиентский шаблон смотрим вот тут. А весь пример целиком можно потискать вот здесь. У меня оно заработало в FF2, IE6 и Opera 9. Однако, я эту методику на практике применять не планирую. Во-первых, подключается не везде легко. Во-вторых, нет у меня доверия XSLT на клиенте. Так что цель статьи - только показать идею, а реализовывать - пока рано.
Кстати. А вот кто-нибудь мне может сказать, как бы организовать подряд 2 преобразования, не используя JavaScript, и не городя огород на сервере? Я пытался из XSLT вставлять processisngInstruction xml-stylesheet со ссылкой на другой шаблон. Казалось бы, это логично. Но вот фиг, не работает и все тут, хотя например в спецухе Мозиллы написано, что должно. Кто-нибудь знает?
Ссылки по теме:
XHTML+XSLT=nofollow+noindex - топик на серче про статью Ayavryk'а
Валидный <noindex>? Можно! - там же, nickspring пытался придумать хак, но вроде не преуспел.
А чем плох JS?
1. У большинства он подключен.
2. Я где-то прочитал, что тот же Яндекс не индексирует то, что находится внутри тега NOSCRIPT. Сказать однозначно так ли это не могу, поскольку уже очень далек от SEO (мне ближе точность, нежели бубен :P ). Но если это так, то засовываем текст, которой не надо индексировать с этот чудный тег. В результате, пользователи с отключенным JS видят текст. А тем, у кого JS включен, через innerHTML "дергаем" данный текст и опять через innerHTML добавляем на страницу. :)