Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Идентификаторы сессий и поисковые роботы

О дубликатах страниц мы уже говорили. Они не нужны в индексах поисковых систем, они вредят сайту и от них нужно избавляться полностью. Но на многих сайтах могут быть ссылки с идентификаторами сессий и обойтись без них нельзя. Как быть с ними?

Для тех, кто не понял сути проблемы, объясню. Для идентификации посетителя на всех страницах сайта скрипт может открыть этому посетителю сессию с уникальным идентификационным номером – обычно используется случайное 32-разрядное 16-ричное число. В php идентификатор по умолчанию называется PHPSESSID. Этот идентификатор посылается посетителю в Cookie и одновременно для надежности присоединяется как параметр ко всем ссылкам на странице. Теперь, пока посетитель бродит по сайту, в ссылке передается идентификатор, если он не обнаружен в Cookie.

Но это параметр, наличие которого не меняет содержание страницы. И каждый идентификатор уникален. Мы получаем возможность индексирования поисковыми системами астрономического числа одинаковых страниц с разными уникальными URL. Скрипт не различает посетителей и поисковому роботу по запросу будет также выдана страница с уникальным параметром в ссылках. Причем, каждый визит робота по ссылке без идентификатора будет вызывать выдачу ему нового идентификатора и нового комплекта «уникальных» ссылок. В индексе поисковой системы накапливается множество дубликатов страниц и конца этому не видно...

Многие разработчики подходят к этому вопросу просто: для идентификации придуманы Cookie, так что незачем использовать идентификаторы сессий в URL. Я, пожалуй, готов с этим согласиться. Но тем не менее, некоторая часть посетителей отключает Cookie в своих браузерах... они, видите ли, где-то слышали, что от Cookie может исходить какая-то угроза их безопасности и решили перестраховаться. Чушь, конечно же – перехват идентификатора в ссылке может произойти куда легче, просто по неосторожности пользователя. Но тем не менее, в эту чушь продолжают верить. А владельцу интернет-магазина не хочется терять покупателя из-за этих нелепых предрассудков. Пусть уж лучше будут ссылки с «хвостом».

Разумный компромисс очевиден: роботам сессию не открывать. Как это сделать, если движок уже готов и проверка роботов не предусмотрена?

Нужно только внедрить в движок проверку переменной окружения HTTP_USER_AGENT. Если в ней содержится имя поискового бота, которому мы не хотим отдавать ссылки с сессиями, то прежде всего нужно не запускать сессию. А если робот пришел по ссылке, уже содержащей идентификатор сессии, нужно отдать ему HTTP-заголовок со статусом «404 Not Found», чтобы робот считал эту ссылку недействительной. Таким образом мы не только предотвращаем появление таких ссылок в индексе, но и заставляем поисковую систему исключить все ссылки с идентификатором сессии, как несуществующие.

Ниже – пример кода для такой проверки. Этот фрагмент кода нужно вставить во всех скриптах движка вместо вызова функции session_start().


$se_mask = "(Yandex|Googlebot|StackRambler|Yahoo Slurp|WebAlta|msnbot)";
if (ereg($se_mask,$_SERVER['HTTP_USER_AGENT'])) {
  if (!empty($_GET['PHPSESSID'])) {
    header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
    exit();
  }
} else {
  session_start();
}

Довольно просто. Переменная $se_mask содержит маску регулярного выражения с перечислением имен роботов, которым вы не хотели бы отдавать ссылки с идентификатором. Если ни одно из имен не будет найдено в HTTP_USER_AGENT, то запустится сессия. Значит, пришел нормальный посетитель (или какой-то незнакомый робот... но раз мы его сюда не звали, то и его проблемы нас мало волнуют).

Если имя бота найдено, то далее следует проверка – содержит ли ссылка GET-параметр с названием PHPSESSID. Если содержит, значит, робот запрашивает страницу с «хвостатым» адресом. Ему нужно передать, что такой страницы нет, он пришел по неправильной ссылке. Отдаем ему заголовок со статусом 404 и прекращаем работу скрипта.

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

И еще одно дополнение. Для тех, кто волнуется. Это не клоакинг. :-) Клоакингом считается избирательная выдача по одному и тому же URL страниц с разным контентом – один вариант для людей, а другой для роботов. А у нас просто предотвращается считывание поисковым роботом дубликатов страниц с разными URL. За это никаких санкций от поисковой системы не будет. Наоборот, в рекомендациях для вебмастеров поисковики просят не выдавать их роботам ссылки с идентификаторами сессий. Ни Яндексу, ни Гуглю вовсе не нужно хранить миллиарды копий вашей страницы.