понедельник, 17 декабря 2012 г.

Убираем сессии из URL форума IPB 3

Заметил, что бот Sape индексируют один из моих форумов, который использует движок IP.Board, вместе с идентификаторами сессий в адресе страниц. Что не есть хорошо, т.к. возникает множество дублей страниц, да и ссылки не красивые.
Поискал, как решить проблему, нашёл такой вариант - нужно в файле admin/sources/classes/output/publicOutput.php найти строку:
$this->settings['base_url'] .= 's='.$this->member->session_id.'&';
и заменить её на:
if ( $this->member->session_type != 'cookie' AND !$this->member->is_not_human )
{
if ( $this->ipsclass->ip_address=="188.72.80.205" OR $this->ipsclass->ip_address=="188.72.80.201" )
{
$this->settings['base_url'] .= '';
}
else
{
$this->settings['base_url'] .= 's='.$this->member->session_id.'&';
}
}
где IP-адреса это те, с которых на сайт приходят боты Sape.
Мне показалось данное решение не слишком изящным. Зависимость от конкретного адреса это не очень удобно, ведь в случае его изменения, всё опять перестанет работать и нужно будет править код. Да и проблема может всплыть не только при работе с данной биржей ссылок, но и где-нибудь ещё. Требуется универсальное решение.
Я смоделировал ситуацию, якобы я робот, отключил в браузере Cookies и зашёл на сайт, все ссылки на форумы и темы имели в адресе строки типа "s=794e6b3979055a012992bd6bbbe7fd28". Полез читать мануалы, чтобы подробнее разобрать в механизме работы сессий в. Нашёл, что чтобы убрать сессии из адресов нужно в файл .htaccess добавить строки:
php_flag session.use_trans_sid off
php_flag session.use_cookies on
php_flag session.use_only_cookies on
Но это полумера, поэтому не помогло. В движке от Invision старт сессий происходит не внутренней командой PHP, а с помощью собственной функции. Тут мне пришла в голову мысль, а что если отключить сессии в адресе для всех неавторизованных посетителей? И я написал следующую конструкцию:
if ( $this->memberData['member_id'] )
{
$this->settings['base_url'] .= 's='.$this->member->session_id.'&';
}
}
Т.е. всего лишь добавил условие для действия той строки из вышеуказанного файла. Но какой эффект! Теперь все адреса стали чистыми, но и функциональность не нарушилась для пользователей с отключенными Cookies, если они авторизуются на форуме, то сессии появятся, но только для них. А боты будут видеть только чистые ссылки, т.к. регистрироваться на форуме им и не нужно.