Проблема в передаче cookie между поддоменами

Fakir

в работе над собой
Проблема в передаче cookie между поддоменами

Приветствую!

Исходные:

Два поддомена one.domain.ru и too.domain.ru.

На домене one.domain.ru скрипт ct.php:

PHP:
ini_set("display_errors",1);
ini_set("session.cookie_domain",".domain.ru"); 

session_start();

print_r($_COOKIE);

echo '<a href="http://too.domain.ru/ct.php">too.domain.ru</a>';
На домене too.domain.ru скрипт ct.php:

PHP:
ini_set("display_errors",1);
ini_set("session.cookie_domain",".domain.ru"); 

session_start();

print_r($_COOKIE);
В случае работы с браузерами FireFox и Opera сессия между доменами передается. При работе в IE (6.0.2900) сессия не устанавливается вообще, и соответственно при переходе на too.domain.ru не передается.

Заголовки (при работе с IE):

Запрос #1

GET /ct.php HTTP/1.1
Accept: */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863); .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: one.domain.ru
Connection: Keep-Alive

HTTP/1.1 200 OK
Date: Thu, 15 Nov 2007 23:11:30 GMT
Server: Apache
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=ml07irnvh26ttcrbrt5h0n0af1; path=/; domain=.domain.ru
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 71
Connection: close
Content-Type: text/html; charset=WINDOWS-1251

Запрос #2 (обновляем)

GET /ct.php HTTP/1.1
Accept: */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863); .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: one.domain.ru
Connection: Keep-Alive

HTTP/1.1 200 OK
Date: Thu, 15 Nov 2007 23:11:33 GMT
Server: Apache
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=savoqikgh90annb71bma08b5h1; path=/; domain=.domain.ru
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 71
Connection: close
Content-Type: text/html; charset=WINDOWS-1251

Замечаем что PHPSESSID сервер возвращает другой. Вопрос: Где можно покопать? Не работает только в IE!
 

Fakir

в работе над собой
Да, убирая строку

PHP:
ini_set("session.cookie_domain",".domain.ru");
IE сессию запоминает. Но соответственно сессия не передается на другой поддомен.

С вышеописанным примером провел опыт у другого провайдера, там все отрабатывается корректно, IE работает адекватно. Склоняюсь к конфигурации сервера.

Еще один ньюанс, IP domain.ru - XXX.XXX.XXX.XXX, IP one.domain.ru и too.domain.ru - YYY.YYY.YYY.YYY. Но судя по документации сессий, это не при делах...
 

Pigmeich

Новичок
два, кстати, two пишется, но так как to, too and two - омонимы, ничего особо страшного.

Браузер один и тот же был (в смысле настройки одинаковые?). Веб-сервера какие именно?

И кстати, а почему бы тебе не передать идентификацию сессии в ссылке на второй подомен?
 

Fakir

в работе над собой
Автор оригинала: Pigmeich
Браузер один и тот же был (в смысле настройки одинаковые?). Веб-сервера какие именно?
Да, браузер один и тот же.

Что касается веб-сервера:

Тот на котором работает - FreeBSD 4.11-RELEASE-p10/Apache 1.3.34/PHP 4.4.2
Тот на котором не работает - Linux 2.6.9-34.ELsmp/Apache 2.0/PHP 5.1.6


Автор оригинала: Pigmeich
И кстати, а почему бы тебе не передать идентификацию сессии в ссылке на второй подомен?
Задача не обойти проблему, а понять почему не работает...
 

Pigmeich

Новичок
Задача не обойти проблему, а понять почему не работает...
Странный подход.

ну да ладно... С IE логика и стандарты, как изветсно не работают, так что попробуй убрать точку перед именем домена.

А вообще, установка домена куки не соответсвующему домену сайта квалифицируется некоторыми браузерами, как попытка хака. Потому очень интересно, почему тебе захотелось именно через куки сесию перетащить.
 

Fakir

в работе над собой
Автор оригинала: Pigmeich
Странный подход.

ну да ладно... С IE логика и стандарты, как изветсно не работают, так что попробуй убрать точку перед именем домена.

А вообще, установка домена куки не соответсвующему домену сайта квалифицируется некоторыми браузерами, как попытка хака. Потому очень интересно, почему тебе захотелось именно через куки сесию перетащить.
Почему странный? Я не хочу SID сессии таскать в адресе всех страниц, программа работает с существующим механизмом на других серверах.

Пробовал, убирал точку, результат тот же.

Я разве сказал что я устанавливаю в cookie домен сайта не соответствующему поддомену? domain.ru - это мой сайт, физически он хоститься на другом сервере с другим IP адресом в отличии от one.domain.ru и too.domain.ru , которые так же мои сайты.

Из мануала setcookie:

To make the cookie available on all subdomains of example.com then you'd set it to '.example.com'. The . is not required but makes it compatible with more browsers. Setting it to www.example.com will make the cookie only available in the www subdomain. Refer to tail matching in the spec for details.
 

Nelius

кипарис во дворе
Понимаю что ваша задача прежде всего разобраться в причинах и считаю что это правильно, но как вариант решения, если не удасться, предлагаю просто продублировать куки с идентификатором сессии с указанием домена "too.domain.ru".
 

Фанат

oncle terrible
Команда форума
Pigmeich
прикрути фитилек.

Вопрос, что совершенно не характерно для этого форума, оформлен на удивление грамотно.
Ответы же, что очень характерно для этого форума - о чем угодно, только не по теме.

Fakir
могу предложить только отлаживать работу кук, работая конкретно с куками.
то есть, выставлять их не функцией session_start(), а setcookie()
хотя, конечно, большой теоретической разницы я не вижу, но программистская привычка уменьшать количество неизвестных.

-~{}~ 16.11.07 15:21:

Nelius
ты, блин, вообще вопроса не понял.
у него куки не работают НА ОДНОМ домене.

-~{}~ 16.11.07 15:22:

Fakir
домены тестовые, от балды? или реальные?
если первое, то попробуй второе
 

Nelius

кипарис во дворе
*****
ты, блин, вообще вопроса не понял.
у него куки не работают НА ОДНОМ домене.
Я это понял. Я просто предложил вместо одной куки с доменом ".domain.ru" ставить две куки с ssid с доменами "one.domain.ru" и "two.domain.ru". Мож где-то и не прав...
 

Fakir

в работе над собой
Автор оригинала: *****

Fakir
могу предложить только отлаживать работу кук, работая конкретно с куками.
то есть, выставлять их не функцией session_start(), а setcookie()
хотя, конечно, большой теоретической разницы я не вижу, но программистская привычка уменьшать количество неизвестных.
Я тоже не вижу, но с привычкой согласен...

ct.php on one.domain.ru

PHP:
ini_set("display_errors",1);

if (isset($_GET['set'])) {
  setcookie('crossdomain', 'test', time()+3600 * 24 * 365, "/", ".domain.ru");
}

print_r($_COOKIE);

echo '<br><br><a href="http://too.domain.ru/ct.php">too.domain.ru</a>';
ct.php on too.domain.ru

PHP:
ini_set("display_errors",1);

print_r($_COOKIE);
Заголовки (IE):

Запрос #1

GET http: //one.domain.ru/ct.php?set HTTP/1.0
Accept: */*
Accept-Language: ru
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))
Host: one.domain.ru
Proxy-Connection: Keep-Alive

HTTP/1.0 200 OK
Date: Fri, 16 Nov 2007 13:18:23 GMT
Server: Apache
X-Powered-By: PHP/5.1.6
Set-Cookie: crossdomain=test; expires=Sat, 15-Nov-2008 13:18:23 GMT; path=/; domain=.domain.ru
Content-Length: 71
Content-Type: text/html; charset=WINDOWS-1251
Proxy-Connection: keep-alive

Обновляем:

GET http: //one.domain.ru/ct.php?set HTTP/1.0
Accept: */*
Accept-Language: ru
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.9 (build 01863))
Host: one.domain.ru
Proxy-Connection: Keep-Alive

HTTP/1.0 200 OK
Date: Fri, 16 Nov 2007 13:20:03 GMT
Server: Apache
X-Powered-By: PHP/5.1.6
Set-Cookie: crossdomain=test; expires=Sat, 15-Nov-2008 13:20:03 GMT; path=/; domain=.domain.ru
Content-Length: 71
Content-Type: text/html; charset=WINDOWS-1251
Proxy-Connection: keep-alive

И уже при обновлении страницы, IE не ставит cookie (или не возвращает их), хотя сервер в заголовках указывает на это.

Автор оригинала: *****
Fakir
домены тестовые, от балды? или реальные?
если первое, то попробуй второе
Название доменов заменены вымышленными.

-~{}~ 16.11.07 16:20:

Автор оригинала: Nelius
Я просто предложил вместо одной куки с доменом ".domain.ru" ставить две куки с ssid с доменами "one.domain.ru" и "two.domain.ru". Мож где-то и не прав...
Наивно :) Поставить куку для другого домена нельзя, только для домена в котором ставиться кука, или для корневого, как в моем случае.
 

dimagolov

Новичок
Fakir, однако по факту куки ставятся на фактический домен, а на более высокого уровня не ставятся....

стоп, а что за время на сервере? вроде когда ты писал пост уже 16 было?
Set-Cookie: crossdomain=test; expires=Sat, 15-Nov-2008 13:20:03 GMT; path=/; domain=.domain.ru
 

Fakir

в работе над собой
Автор оригинала: dimagolov
Fakir, однако по факту куки ставятся на фактический домен, а на более высокого уровня не ставятся....

стоп, а что за время на сервере? вроде когда ты писал пост уже 16 было?
Set-Cookie: crossdomain=test; expires=Sat, 15-Nov-2008 13:20:03 GMT; path=/; domain=.domain.ru
Если я скажу что ставить надо на фактический домен, а не на корневой, то все ставиться без проблем.

13:20:03 GMT - + 3 часа прибавь ;о)
 

Fakir

в работе над собой
Beavis, А что там должно быть еще при установке cookies такого вида?

PHP:
setcookie('crossdomain', 'test', time()+3600 * 24 * 365, "/", ".domain.ru");
 

dimagolov

Новичок
Beavis, Fakir про дату я тормозил.

попробуй после загрузки странички посмотреть куки. так как ИЕ их кому попало не показывает, то в строку url введи
Код:
javascript:alert("Cookies: "+document.cookie)
(пробел убрать надо), по крайней мере убедимся, что ИЕ их не принимает, если они не для текущего домена.

дал бы ссылки на свои домены, смогли бы потестить на своих ИЕ, может что новое увидели бы....
 

Fakir

в работе над собой
dimagolov, толку от шаманских бубнов не вижу, факт того что в списке заголовков сервер возвращает Set-Cookie в наличии, а вот IE не следует директивам сервера по каким-то (своим, на мой взгляд) убеждениям.

Дмитрий, ссылка: http://office.dp.ru/cookie.test.php?set, и уже на этой странице cookie не ставиться.

Вторая: http://office.dp.ru/cookie.test.php
 

Фанат

oncle terrible
Команда форума
толку от шаманских бубнов не вижу, факт того что в списке заголовков сервер возвращает Set-Cookie в наличии, а вот IE не следует директивам сервера по каким-то (своим, на мой взгляд) убеждениям.
очень. очень странная тирада
 
Сверху