33

我正在一个具有多个子域的站点上工作,其中一些应该有自己的会话。

我想我已经解决了,但是注意到一些我不理解的关于 cookie 处理的事情。我在文档中没有看到任何解释它的内容,所以我想我会看看这里是否有人对这个问题有所了解。

如果我这样做:

session_start();

我最终得到一个像这样的会话cookie:

子域.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 域,它会自动在前面加上点,这意味着该域及其所有子域。如果我不设置域,那么它只使用当前域就可以了。

知道是什么原因造成的,我能做些什么来控制那个前置点吗?

谢谢!

4

6 回答 6

24

PHP 的 cookie 函数会自动在 $domain 前面加上一个点。如果你不想要这种行为,你可以使用header函数。例如:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
于 2008-12-07T23:42:01.707 回答
22

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

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

你会得到一个带有“subdomain.example.net”(而不是“.subdomain.example.net”)的cookie

于 2009-04-13T23:14:05.077 回答
14

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

https://www.rfc-editor.org/rfc/rfc6265#section-5.4

于 2011-11-14T13:14:46.453 回答
11

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

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

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

因此,要做到这一点并且仍然能够设置 httponly 和安全模式,请将域设置为 NULL,如下所示:

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

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

于 2012-02-25T12:14:10.350 回答
2

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

希望这可以节省一些时间!

于 2011-01-23T13:43:01.660 回答
0

我在 wordpress 上设置 cookie 时遇到问题,这对我有帮助,域值是让它在所有页面中工作的关键

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

setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
于 2019-03-03T23:12:35.467 回答