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, он автоматически будет дополнен точкой, означающей этот домен и все его дочерние элементы. Если я не установлю домен, то он его получит правильно, используя только текущий домен.
Есть идеи, что вызывает это, и что я могу сделать, чтобы контролировать эту предшествующую точку?
Спасибо!
5 answers
Функции файлов cookie PHP автоматически ставят перед доменом $ точку. Если вы не хотите такого поведения, вы можете использовать функцию заголовка. Например:
header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
Если вы запустите свой PHP-скрипт под "http://subdomain.example.net", не используйте параметр домена:
setcookie('cookiename','cookievalue',time()+(3600*24),'/');
Вы получите печенье с "subdomain.example.net "(и не".subdomain.example.net ")
Если вы прочтете весь RFC 6265, вы поймете, что единственный правильный способ иметь файл cookie "только для хоста" - это НЕ устанавливать атрибут домена.
Я понимаю, что это старый вопрос, но у меня была эта проблема, и ни один из приведенных выше ответов не сделал этого полностью.
Я хотел установить файл cookie сеанса для поддомена, но также включить httponly и безопасный.
Чтобы избежать ведущего. перед поддоменом Кевин и столсвик правы, не устанавливайте атрибут домена.
Поэтому, чтобы сделать это и при этом иметь возможность установить httponly и безопасный режим, установите для домена значение NULL следующим образом:
session_set_cookie_params(0, '/', NULL, TRUE, TRUE);
Теперь у вас будет сеанс файл cookie для определенного поддомена (без ведущего.) с httponly и безопасным значением true.
Это может кому-то помочь (я потратил несколько часов, чтобы разобраться в этом). После внесения изменений в исходные файлы и перед тестированием закройте браузер, чтобы правильно удалить PHPSESSIONID во всех доменах и поддоменах.
Надеюсь, это сэкономит немного времени!