2008-12-07 5 views
26

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

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

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

session_start(); 

Я в конечном итоге с куки сессии, как это:

subdomain.example.net

Однако, если я делать какие-либо попытки установить куки домен сам, либо как

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

или как

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

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

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

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

Спасибо!

+0

Вам не нужно контролировать ведущую точку, потому что она просто * игнорируется * браузером, в соответствии с RFC 6265, что и каждый современный браузер. Поэтому просто не думайте о ведущей точке. Помимо этого, установите для домена cookie явным образом или установите его в пустую строку, чтобы ограничить его хостом текущего запроса. В библиотеке https://github.com/delight-im/PHP-Cookie есть некоторые удобные элементы управления для этого. – caw 2016-07-13 00:05:28

ответ

24

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

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net"); 
+12

Если вы прочитали все RFC 6265, вы поймете, что единственный правильный способ иметь «cookie только для хоста» - НЕ устанавливать атрибут домена. http://tools.ietf.org/html/rfc6265#section-5.4 – stolsvik 2011-11-14 13:13:56

+1

«единственный правильный способ иметь« cookie »только для хоста - НЕ устанавливать атрибут домена« Не определен для PHP, но это помогли мне решить проблему, когда мы переключались с файлов cookie HOST только на файлы cookie x-subdomain, и я пытался удалить только cookie хоста в javascript, указав полный домен, а JavaScript доставлял точку, которая вызывала домен существующего файла cookie не совпадать, и в результате не удаляться. – 2014-06-30 18:32:48

16

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

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

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

+0

В чем разница между явным доменом, установленным на subdomain.example.net, и тем, который не установлен? – Pacerier 2013-06-07 00:54:39

+0

, если вы установите его, вы получите точку впереди, которая соответствует всем поддоменам, а не только соответствует только текущему субдомену. – troseman 2013-07-26 20:48:59

2

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

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

7

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

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

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

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

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

Теперь вы будете иметь куки сессии, для конкретного поддомена (без ведущего .) с httponly и secure установлено в true.

Смежные вопросы