Печенье через поддоменов и хостов - PullRequest
16 голосов
/ 18 декабря 2008

В приложении, которое я пишу, используя комбинацию сред разработки и языков, мне нужно получить доступ к cookie из двух разных поддоменов, каждый на отдельном хосте.

Файл cookie устанавливается на www.mydomain.com с использованием следующего кода PHP, и я пытаюсь получить к нему доступ с distant.mydomain.com на отдельном хосте.

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', '.mydomain.com');  

Я пытаюсь получить доступ к cookie из distant.mydomain.com, используя следующий код:

if (isset($_COOKIE['token'])) { /* do stuff */ }  

Проблема: distant.mydomain.com не находит cookie. Только что упомянутый оператор if возвращает false, даже если cookie существует.

Я подтвердил, что установленный файл cookie предназначен для mydomain.com (проверив мои файлы cookie Firefox). Я не могу придумать причину, по которой это не сработает.

Используя тот же код setcookie, у меня есть старое приложение, работающее исключительно на хосте www.mydomain.com, и это приложение может получать доступ к cookie через домены. Это заставляет меня подозревать, что проблема связана с отдельными хостами.

На всякий случай, если уместна любая из следующих сведений:
- www.mydomain.com - это IIS 6.0
- distant.mydomain.com - это Apache 2.2.9
- Оба сервера используют PHP 5.2.x
- Оба сервера работают на Windows Server 2003

Если есть какая-либо дополнительная информация, которую я могу предоставить, чтобы лучше описать проблему, пожалуйста, сообщите мне!

Ответы [ 5 ]

12 голосов
/ 18 декабря 2008

В интересах любого, кто читает этот вопрос, код и информация, содержащиеся в оригинальном сообщении, являются точными и работают нормально.

Проблема в том, когда вы внедряете другие технологии. Например, С тех пор я узнал, что отправка кода PHP через модуль Python, который позволяет Django обслуживать файлы / контент PHP, сильно меняет то, что доступно сценарию, а что нет.

Это было в конечном итоге обнаружено по совету Марка Новаковского , который предложил отправить $_COOKIE в журнал, чтобы выяснить, что там было.

Я также проверил $_SERVER и $_GET. Это была пустота $_GET, которая подсказала мне, что установка, которую я пытаюсь использовать, не так проста, как я думал. Именно это ошибочное понимание привело к тому, что информация о Джанго не была включена в первоначальный пост.

Извинения и спасибо всем, кто ответил на этот вопрос!

4 голосов
/ 14 марта 2011

Cookies установлены в домене

'.aaa.sub.domain.com'

будет конфликтовать с cookie-файлами с одинаковыми именами, установленными в домене

'.sub.domain.com'

и '.some.stupidly.obscure.multi.sub.domain.com'

Это означает (и это заняло некоторое время), если вы собираетесь использовать одноименные файлы cookie в нескольких доменах, вы должны установить его один раз (и только один раз) в основном / основном домене, в этом case '.domain.com'; в противном случае полученный в результате файл cookie будет возвращаться неопределенным и случайным образом, иногда «яшма» cookie устанавливается в .a.sub.domain.com, иногда «яшма» cookie устанавливается в .sub.domain.com, иногда cookie » jasper 'установлен в .bcddomain.com, иногда cookie' jasper 'установлен в' .sub.domain.com ', а иногда cookie' jasper 'установлен в' .domain.com '

3 голосов
/ 18 декабря 2008

Использует ли один из поддоменов подчеркивание? IE имеет проблемы с принятием файлов cookie с поддоменов, которые не соответствуют URI RFC.

Это выглядит как «дальний» - это местозаполнитель, а не фактическое имя субдомена и, конечно, то, что вы используете IE. Хотя на другие браузеры вполне может повлиять as, Fireworks этого не делает.

1 голос
/ 18 декабря 2008

Я бы попробовал установить Charles Proxy и посмотреть, какие заголовки а) отправляются в Firefox для начала (установить cookie) и б) какие заголовки отправляются из Firefox на второй сервер , По крайней мере, таким образом вы можете сузить суть проблемы (браузер или сервер).

0 голосов
/ 18 декабря 2008

С php.net о функции setCookie :

Путь на сервере, на котором будет доступен файл cookie. Если установлено значение «/», файл cookie будет доступен во всем домене. Если установлено значение «/ foo /», файл cookie будет доступен только в каталоге / foo / и во всех его подкаталогах, таких как / foo / bar / домена. Значением по умолчанию является текущий каталог, в котором устанавливается файл cookie.

Домен, в котором доступен файл cookie. Чтобы файл cookie был доступен во всех поддоменах сайта example.com, установите для него значение «.example.com». . не требуется, но делает его совместимым с большим количеством браузеров. Установка этого параметра на www.example.com сделает куки доступными только в поддомене www. Для получения подробной информации см. Соответствие хвоста в »спецификации.

В основном: ваш 4. и 5. параметр должен быть проверен: Хорошо, ваш путь, кажется, в порядке, но домен должен быть изменен:

Сегодня вы блокируете cookie для всех, кроме домена A, но хотите, чтобы он был доступен как для домена A, так и для B. Это немного сложно, но может быть решено. Получите вдохновение на 15 секунд ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...