В приложении, которое я пишу, используя сочетание среды разработки и языков, мне нужно получить доступ к файлу 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
оператор 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
Если есть какая-либо дополнительная информация, которую я могу предоставить, чтобы лучше описать проблему, пожалуйста, дайте мне знать!
В интересах любого, кто читает этот вопрос, код и информация, содержащиеся в исходном посте, точно верны и работают нормально.
Проблема заключается в том, что вы вводите другие технологии. Например, с тех пор я узнал, что отправка PHP-кода через модуль Python, который позволяет Django обслуживать PHP-файлы / контент, сильно изменяет то, что доступно для скрипта, а что нет.
Это было в конечном итоге обнаружено по совету Марка Новаковского , который предложил отправить $_COOKIE
в журнал, чтобы узнать, что там было.
Я также проверил $_SERVER
и $_GET
. Это была пустота $_GET
которая подсказывала мне, что установка, которую я пытаюсь использовать, не так проста, как я думал. Это было ошибочное понимание, которое привело к тому, что информация о Django не была включена в исходное сообщение.
Извинения и благодарность всем, кто ответил на этот вопрос!
Куки-файлы в домене
'.aaa.sub.domain.com'
столкнется с одинаково названными файлами cookie, установленными в домене
'.sub.domain.com'
и '.some.stupidly.obscure.multi.sub.domain.com'
Это означает, что (и это заняло некоторое время, чтобы пройти через), если вы собираетесь использовать одноименный cookie для нескольких доменов, вы должны установить его один раз (и только один раз) в основном / базовом домене, в этом случае '. domain.com '; в противном случае результирующий cookie будет неопределенно и случайным образом возвращаться, иногда «яшма» cookie, установленная на .a.domain.com, иногда «яшма» cookie, установленная в .domain.com, иногда cookie ' jasper ', установленный в .bcddomain.com, иногда cookie' jasper ', установленный в' .sub.domain.com ', а иногда и' jasper 'cookie, установленный в' .domain.com '
Использует ли один из поддоменов символ подчеркивания? У IE проблемы с кукисами из субдоменов, которые не соответствуют URI RFC.
Это asumming «отдаленный» является заполнителем, а не фактическим именем субдомена и, конечно, вы используете IE. Хотя больше браузеров вполне может быть реализовано, как, например, Fireworks.
Я бы попробовал установить Charles Proxy и посмотреть, какие заголовки a) отправляются в Firefox, чтобы начать (установить cookie) и b) какие заголовки отправляются из Firefox на второй сервер. По крайней мере, вы можете сузить место проблемы (браузер или сервер).
От php.net о функции setCookie :
Путь на сервере, на котором будет доступен cookie. Если установлено значение '/', файл cookie будет доступен во всем домене. Если установлено значение '/ foo /', cookie будет доступен только в каталоге / foo / и всех подкаталогах, таких как / foo / bar / домена. Значение по умолчанию – это текущий каталог, в который установлен файл cookie.
Домен, доступный для файла cookie. Чтобы сделать файл cookie доступным во всех поддоменах example.com, вы должны установить его на .example.com. . не требуется, но делает его совместимым с большим количеством браузеров. Установка его на http://www.example.com сделает cookie доступным только в субдомене www. Подробнее см. В описании хвоста в спецификации.
В принципе: необходимо проверить ваш параметр 4. и 5. Ну, ваш путь кажется прекрасным, но домен необходимо изменить:
Сегодня вы блокируете файл cookie ко всем другим, кроме домена A, но хотите, чтобы он был доступен как для домена A, так и для B. Это немного сложно, но может быть решена. Вдохните 15 секунд 😉