PHP:Cookie域/子域控件

Eli*_*Eli 30 php cookies

我正在一个有多个子域的网站上工作,其中一些应该得到自己的会话.

我想我已经解决了这个问题,但是我注意到了一些我不理解的cookie处理方法.我没有在文档中看到任何解释它的东西,所以我想我会看到这里是否有人可以解决这个问题.

如果我这样做:

session_start();
Run Code Online (Sandbox Code Playgroud)

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

subdomain.example.net

但是,如果我尝试自己设置cookie域,或者喜欢

ini_set('session.cookie_domain', 'subdomain.example.net');
Run Code Online (Sandbox Code Playgroud)

或者喜欢

session_set_cookie_params( 0, "/", "subdomain.example.net", false, false);
Run Code Online (Sandbox Code Playgroud)

我最终得到了.subdomain.example.net的cookie(注意开头的点),我相信这意味着"匹配所有子域(或者在这种情况下是子子域)".

这实际上发生在我所有的cookie上,而不仅仅是会话.如果我自己设置cookie域,它会自动添加点,这意味着该域及其所有子域.如果我没有设置域,那么它只使用当前域就可以了.

知道是什么导致这个,以及我可以做些什么来控制前置点?

谢谢!

Bri*_*her 24

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

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

  • 如果您阅读了所有RFC 6265,您将意识到拥有"仅限主机"cookie的唯一正确方法是不设置域属性.http://tools.ietf.org/html/rfc6265#section-5.4 (13认同)
  • “拥有“仅主机”cookie 的唯一正确方法是不设置域属性”不是特定于 PHP,但这帮助我解决了当我们从仅主机 cookie 切换到 x 子域 cookie 时出现的问题试图通过指定完整域来删除 javascript 中的仅主机 cookie,而 JavaScript 会在前面添加一个点,这会导致现有 cookie 的域不匹配,因此不会被删除。 (2认同)

Kev*_*ion 17

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

setcookie('cookiename','cookievalue',time()+(3600*24),'/');
Run Code Online (Sandbox Code Playgroud)

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


sto*_*vik 12

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

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


Ale*_*lex 9

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

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

避免领先.面向子域,凯文和stolsvik是正确的,不设置域属性.

因此,要执行此操作并仍然能够设置httponly和安全模式,请将域设置为NULL,如下所示:

session_set_cookie_params(0, '/', NULL, TRUE, TRUE);
Run Code Online (Sandbox Code Playgroud)

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