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