Вы никогда не сталкивались с проблемой, когда после авторизации на сайте www.domain.ru вы переходите на domain.ru, а вас не узнают?
Или вот, случай из жизни. Заходите в интернет-магазин aaa.ru, в разделе comp.aaa.ru добавляете в корзину один товар, переходите в раздел audio.aaa.ru, а корзина опять пустая. И делай чего хочешь — НЕ РАБОТАЕТ!
Я сталкиваюсь с подобными проблемами КАЖДЫЙ ДЕНЬ. Куча форумов, интернет-магазинов... да тот же news2.ru тоже имеет эту проблему.
Попробуйте зайти на news2.ru, залогиниться, а потом зайти на www.news2.ru. Вам скажут: «Привет, Гость!».
В принципе, в чем проблема — я догадался уже давно... Дело в том, что cookie, «ключик», по которому сайт вас узнает, ставится на domain.ru, домен второго уровня. А вот в домене третьего уровня (www.domain.ru) cookie уже не видится. И идут косяки.
Полистав RFC, узналось, что можно поставить кукиз на .domain.ru
Обратите внимание на ТОЧКУ перед именем домена. Это значит, что кука будет доступна как и при обращении к domain.ru, так и во всех поддоменах ТРЕТЬЕГО уровня. Это то, что было нам нужно :-)
Как в PHP это делается? Просто! Функция session_set_cookie_params:
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure]]] )
int lifetime — время жизни кука. Обычно session_start(); ставит куку PHPSESSID с lifetime=0. То есть после закрытия браузера кук удалится и сессия закроется. Если поставить число (в секундах) побольше, то после закрытия браузера сессия не умрет сразу, в течение этого времени можно будет открыть сайт заново, и вы останетесь залогиненным, товар в корзине интернет-магазина останется на месте.
string path — путь, начиная с которого кукиз будет действительным. «/» — значит, что прямо с корня. Кук будет виден и в http://aaa.ru/ и в http://aaa.ru/vobla
А если, например, передать функции значение path равное «/forum/», то кукиз будет «виден» только из папки и подпапок forum: http://aaa.ru/forum, http://aaa.ru/forum/comp/, но не будет «виден» из: http://aaa.ru/, http://aaa.ru/chat/
string domain — ключевой параметр, который обсуждался :-) Если вы хотите, чтоб кук был виден как по основному адресу http://aaa.ru, так и по адресу http://www.aaa.ru, то передайте функции значение параметра domain равное «.aaa.ru» и все будет тип-топ.
session_set_cookie_params() необходимо вызывать каждый раз перед session_start().
К сожалению, задать список доменов, из под которых будет виден cookie нельзя. Нельзя передать в эту функцию параметр domain типа «www.aaa.ru,comp.aaa.ru,audio.aaa.ru». Тут уже нужно думать, как быть, что делать.
А вот Perl программисты думают сами. Можно точно так же поставить кукиз на .domain.ru
А можно поставить на domain.ru и на www.domain.ru
Это уж на что хватит фантазии :-) Вот так вот.
Удачи в webdev'е, и не забывайте про такие «мелочи».






Pingback: Новости 2.0
Спасибо, актуальнейшая вещь !
Не знал даже о такой проблеме!
Спасибо!
занесу в «полезно»
Нужны деньги?
Спасибо. надо будет у себя прописать. Встрачалась такая проблема у меня в блоге.
Такие вещи надо учить ДО того как начали ваять инет-магазины и прочие ВЕБ 2.0 ресурсы
Да, уж, век живи — век учись!
Занес в закладки и исправил свои админки.
Пол года мучился вопросом, почему у меня в Опере, при переходе со страницы на страницу иногда теряются сессии, а в IE — нет.
IE, собака, понимает, что префикс www — это алиас основного домена и не рвёт сессию, а Опера отрабатывает тупо, как и положено.
Думал, что у меня Опера глючит, а оказалось — я сам: кое-где просто доме, а где-то в www, вот и терял сессию.
Автору — респект!
PS: Обидно, что по запросу в Yandex «php сессия Опера» вылезает не эта страница, а какой-то форум, в котором уже стоит ссылка сюда. Значит, надо добавить на эту страницу ключевых слов «PHP», «СЕССИЯ» и «ОПЕРА», что я и сделал :)