PHP: Управление доменом/поддоменом файлов cookie


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

Я думаю, что у меня все получилось, но я заметил кое-что в обработке файлов 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);

В итоге я получаю печенье для.subdomain.example.net (обратите внимание на начальную точку), что, как я полагаю, означает "соответствовать всем поддоменам (или в данном случае поддоменам).

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

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

Спасибо!

 27
Author: Eli, 2008-12-08

5 answers

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

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
 24
Author: Brian Fisher, 2008-12-07 23:42:01

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

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

Вы получите печенье с "subdomain.example.net "(и не".subdomain.example.net ")

 16
Author: Kevin Campion, 2009-04-13 23:14:05

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

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

 12
Author: stolsvik, 2011-11-14 13:14:46

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

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

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

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

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

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

 8
Author: Alex, 2012-02-25 12:14:10

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

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

 2
Author: Luciano Camilo, 2011-01-23 13:43:01