我正在一个具有多个子域的网站上,其中一些应该拥有自己的会话。
我想我已经解决了,但是注意到了一些我不理解的关于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域,它将自动在前面加上点号,表示该域及其所有子域。如果我未设置域,则仅使用当前域即可正确处理。
知道是什么原因造成的,我该怎么做才能控制该前置点?
谢谢!
PHP的cookie函数自动在$ domain前面加一个点。如果您不希望出现这种情况,可以使用标头函数。例如:
header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
如果您在“ http://subdomain.example.net ”下运行PHP脚本,请不要使用domain参数:
setcookie('cookiename','cookievalue',time()+(3600*24),'/');
您将获得一个带有“ subdomain.example.net”(而不是“ .subdomain.example.net”)的Cookie。
如果阅读了所有RFC 6265,您将认识到拥有“仅主机” cookie的唯一正确方法是不设置域属性。
http://tools.ietf.org/html/rfc6265#section-5.4
我意识到这是一个老问题,但是我遇到了这个问题,上面的答案都没有做到。
我想为子域设置会话cookie,但也要启用httponly和安全。
避免领先。在子域的前面,Kevin和stolsvik是正确的,请不要设置domain属性。
因此,要做到这一点并且仍然能够设置httponly和安全模式,请将域设置为NULL,如下所示:
session_set_cookie_params(0, '/', NULL, TRUE, TRUE);
现在,您将拥有一个针对特定子域(不带前导。)的会话Cookie,其httponly和secure设置为true。
这可能会对某人有所帮助(我花了几个小时来解决这个问题)。在源文件中进行更改之后,在进行测试之前,请关闭浏览器以正确销毁所有域和子域中的PHPSESSIONID。
希望这可以节省一些时间!
我在用wordpress设置cookie时遇到了问题,这对我有所帮助,域名价值是使其在所有页面上都能正常工作的关键
$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
文章标签:cookies , php
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!