PHP:Cookie域/子域控件

时间:2008-12-07 23:06:13

标签: php cookies

我正在开发一个有多个子域名的网站,其中一些应该有自己的会话。

我想我已经解决了,但是我注意到了一些我不理解的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上,而不仅仅是会话。如果我自己设置cookie域,它会自动添加点,这意味着该域及其所有子域。如果我没有设置域,那么只使用当前域就可以了。

知道导致这种情况的原因,以及如何控制前置点?

谢谢!

6 个答案:

答案 0 :(得分:24)

PHP的cookie函数会自动在$ domain前加一个点。如果您不想要此行为,可以使用header功能。例如:

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

答案 1 :(得分:17)

如果您在“http://subdomain.example.net”下运行PHP脚本,请勿使用域参数

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

您将获得一个包含“subdomain.example.net”的cookie(而不是“.subdomain.example.net”)

答案 2 :(得分:12)

如果您阅读了所有RFC 6265,您将意识到拥有“仅限主机”cookie的唯一正确方法是不设置域属性。

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

答案 3 :(得分:8)

我意识到这是一个古老的问题,但我遇到了这个问题,上面的答案都没有完成。

我想为子域设置会话cookie,但也启用httponly和secure。

避免领先。在子域面前,凯文和stolsvik是正确的,不要设置域属性。

为了做到这一点并且仍然可以设置httponly和安全模式,请将域设置为NULL,如下所示:

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

现在,您将拥有一个特定子域(没有前导。)的会话cookie,其中httponly和secure设置为true。

答案 4 :(得分:2)

这可能对某人有帮助(我花了几个小时来弄明白这一点)。在源文件中进行更改之后,在测试之前,请关闭浏览器以正确销毁所有域和子域中的PHPSESSIONID。

希望这节省一些时间!

答案 5 :(得分:0)

我在用wordpress设置cookie时遇到了问题,这对我有所帮助,域名价值是使其在所有页面上都能正常工作的关键

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

setcookie("cookie_name", 'cookie_value', 0, '/', $domain);