PHP:Cookie域/子域控制

PHP: Cookie domain / subdomain control

提问人:Eli 提问时间:12/8/2008 更新时间:10/4/2021 访问量:54602

问:

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

我想我已经解决了,但注意到了一些我不理解的关于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 饼干

评论

0赞 caw 7/13/2016
根据 RFC 6265,您不必控制前导点,因为它会被浏览器忽略,这是每个现代浏览器都实现的。所以不要考虑前导点。除此之外,显式设置 cookie 域或将其设置为空字符串以将其限制为当前请求主机。库 github.com/delight-im/PHP-Cookie 为此提供了一些方便的控件。

答:

23赞 Brian Fisher 12/8/2008 #1

PHP 的 cookie 函数会自动在$domain前面加上一个点。如果您不希望出现此行为,则可以使用 header 函数。例如:

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

评论

17赞 stolsvik 11/14/2011
如果您阅读了 RFC 6265 的全部内容,您将意识到拥有“仅限主机”的 cookie 的唯一正确方法是不设置域属性。tools.ietf.org/html/rfc6265#section-5.4
2赞 Scott Jungwirth 7/1/2014
“拥有”仅限主机“cookie的唯一正确方法是不设置域属性” 不是特定于 PHP,但这帮助我解决了从仅 HOST cookie 切换到 x 子域 cookie 时的问题,我试图通过指定完整域来删除 javascript 中的仅主机 cookie,并且 JavaScript 前面预置了一个点,导致现有 cookie 的域不匹配, 因此不会被删除。
22赞 Kevin Campion 4/14/2009 #2

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

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

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

评论

1赞 Pacerier 6/7/2013
设置为 subdomain.example.net 的显式域和未设置的显式域之间有什么区别?
0赞 troseman 7/27/2013
如果你设置了它,你会得到一个与所有子域匹配的点,而不是只匹配当前子域
2赞 Luciano Camilo 1/23/2011 #3

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

希望这能节省一些时间!

评论

1赞 Eli 1/25/2011
如果您想显式管理会话 cookie,也可以使用 Firebug 的会话部分。
16赞 stolsvik 11/14/2011 #4

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

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

评论

0赞 noahnu 9/10/2012
将域设置为“.example.com”应使其仅供主机使用。
1赞 Alejandro 10/4/2021
谢谢,你让我度过了美好的一天!这应该是公认的答案 imo
12赞 Alex 2/25/2012 #5

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

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

为了避免前导.在子域的前面,Kevin 和 stolsvik 是正确的,没有设置域属性。

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

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

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

0赞 Gendrith 3/4/2019 #6

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

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

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