PHP: Cookie-домен / контроль поддоменов - PullRequest
29 голосов
/ 08 декабря 2008

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

Я думаю, у меня все получилось, но я заметил кое-что об обработке файлов cookie, чего я не понимаю. Я не вижу в документах ничего такого, что объясняет это, поэтому подумал, что я посмотрю, есть ли у кого-нибудь здесь хоть какой-то свет, чтобы пролить свет на этот вопрос.

Если я просто сделаю:

session_start();

Я получаю сессионный cookie, как это:

subdomain.example.net

Однако, если я попытаюсь установить домен cookie самостоятельно, например,

ini_set('session.cookie_domain', 'subdomain.example.net');

или как

session_set_cookie_params( 0, "/", "subdomain.example.net", false, false);

Я получаю файл cookie для .subdomain.example.net (обратите внимание на начальную точку), который, как я считаю, означает «соответствовать всем поддоменам (или в данном случае поддоменам).

Похоже, это происходит со всеми моими куки, а не с сессиями. Если я сам задаю домен cookie, к нему автоматически добавляется точка, означающая этот домен и все его дочерние элементы. Если я не установлю домен, он получит правильное использование только текущего домена.

Есть идеи, что вызывает это, и что я могу сделать, чтобы контролировать эту предваряющую точку?

Спасибо!

Ответы [ 6 ]

24 голосов
/ 08 декабря 2008

PHP-функции cookie автоматически префикс $ домена с точкой. Если вы не хотите такого поведения, вы можете использовать функцию header . Например:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
17 голосов
/ 14 апреля 2009

Если вы запускаете ваш PHP-скрипт под "http://subdomain.example.net", , не используйте параметр домена :

setcookie('cookiename','cookievalue',time()+(3600*24),'/');

Вы получите cookie с «subdomain.example.net» (а не с «.subdomain.example.net»)

12 голосов
/ 14 ноября 2011

Если вы прочитаете весь RFC 6265, вы поймете, что единственный правильный способ иметь cookie "только для хоста" - НЕ устанавливать атрибут домена.

http://tools.ietf.org/html/rfc6265#section-5.4

8 голосов
/ 25 февраля 2012

Я понимаю, что это старый вопрос, но у меня была эта проблема, и ни один из приведенных выше ответов не сделал этого полностью.

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

Чтобы избежать ведущего. перед субдоменом, Кевин и Столсвик верны, не устанавливайте атрибут домена.

Таким образом, чтобы сделать это и по-прежнему иметь возможность установить httponly и безопасный режим, установите для домена значение NULL следующим образом:

session_set_cookie_params(0, '/', NULL, TRUE, TRUE);

Теперь у вас будет файл cookie сеанса для определенного субдомена (без начального.) С httponly и безопасным значением true.

2 голосов
/ 23 января 2011

Это может кому-то помочь (я потратил несколько часов, чтобы понять это). После внесения изменений в исходные файлы и перед тестированием закройте браузер, чтобы правильно уничтожить PHPSESSIONID во всех доменах и поддоменах.

Надеюсь, это сэкономит время!

0 голосов
/ 04 марта 2019

У меня была проблема с установкой файлов cookie на WordPress, и это помогло мне, значение домена было ключом, чтобы заставить его работать на всех страницах

$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;

setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...