Народ в очередной раз задался вопросом, как бы так закрыть часть документа от индексации, чтоб при этом все было валидно?
По мотивам статьи от Ayavryk’а сделал свой вариант. В основе лежит ровно та же идея: отдаем на клиент документ, в котором контент, не предназначенный для индексации, спрятан в комментариях, а затем при помощи XSLT достаем его оттуда.
Основная засада заключается в том, что Mozilla Firefox не знает о disable-output-escaping, поэтому исходный метод переставал работать, если в контенте, который мы прячем, встречались вложенные теги. Собственно, эту проблему я решил черезвычайно тупо: дополнительным XSL-преобразованием на сервере.
Пусть у нас имеется (X)HTML-код, в котором некоторые блоки размечены старым добрым невалидным тегом noindex. На сервере мы должны заменить все текстовые узлы внутри noindex’ов на комментарии, а сами noindex’ы заменить на нормальные человеческие теги, каким-то образом отмеченные, чтоб на клиенте знать, что внутри них нужно обрабатывать комментарии.
Я в качестве такого “маркера” использовал класс “noindex”, а в качестве “человеческого тега” - div, либо если noindex[@type = ‘inline’] - то span. Собственно говоря, XSL-шаблон, через который прогоняется документ на сервере.
На клиент приходит документ, в котором тег noindex заменен на div[@class = ‘noindex’], а все текстовые узлы заменены на комментарии. Т.е. что-то в этом духе:
Дорогой Яндекс!
Вот этот кусок можно проиндексировать. А
.
Остается натравить на это безобразие еще один шаблон, уже на клиенте. Он совсем простой: он копирует все дерево, заменяя обратно комментарии на текстовые узлы внутри тегов с классом “noindex”. disable-output-escaping я оставил для наглядности: если бы Фокс с ним дружил, можно было бы обойтись без преобразования на сервере.Остается натравить на это безобразие еще один шаблон, уже на клиенте. Он совсем простой: он копирует все дерево, заменяя обратно комментарии на текстовые узлы внутри тегов с классом “noindex”.