WebDev / PHP / Sessions

Вы никогда не сталкивались с проблемой, когда после авторизации на сайте 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'е, и не забывайте про такие «мелочи».



Посты на схожую тематику:

  1. WebDev / <button>
  2. WebDev / Solitaire on JS
  3. WebDev / Новые Веяния, RubyOnRails
Запись опубликована в рубрике php, webdev. Добавьте в закладки постоянную ссылку.

7 комментариев: WebDev / PHP / Sessions

  1. Уведомление: Новости 2.0

  2. Dik говорит:

    Спасибо, актуальнейшая вещь !

  3. Админ news2 говорит:

    Не знал даже о такой проблеме!

    Спасибо!

  4. цыва говорит:

    занесу в «полезно»

    Нужны деньги?

  5. root говорит:

    Спасибо. надо будет у себя прописать. Встрачалась такая проблема у меня в блоге.

  6. Michael de`OZ говорит:

    Такие вещи надо учить ДО того как начали ваять инет-магазины и прочие ВЕБ 2.0 ресурсы

  7. Юрий говорит:

    Да, уж, век живи — век учись!

    Занес в закладки и исправил свои админки.

    Пол года мучился вопросом, почему у меня в Опере, при переходе со страницы на страницу иногда теряются сессии, а в IE — нет.

    IE, собака, понимает, что префикс www — это алиас основного домена и не рвёт сессию, а Опера отрабатывает тупо, как и положено.

    Думал, что у меня Опера глючит, а оказалось — я сам: кое-где просто доме, а где-то в www, вот и терял сессию.

    Автору — респект!

    PS: Обидно, что по запросу в Yandex «php сессия Опера» вылезает не эта страница, а какой-то форум, в котором уже стоит ссылка сюда. Значит, надо добавить на эту страницу ключевых слов «PHP», «СЕССИЯ» и «ОПЕРА», что я и сделал :)