【问题标题】:PHP: Cookie domain / subdomain controlPHP:Cookie 域/子域控制
【发布时间】:2010-09-25 18:50:46
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

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

标签: php cookies


【解决方案1】:

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

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

【讨论】:

  • 将域设置为“.example.com”应该使其成为主机专用。
  • 谢谢,你让我开心!这应该是imo接受的答案
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    为了避免前导 .在子域前面,Kevin 和 stolsvik 是对的,不要设置域属性。

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 如果您想显式管理会话 cookie,也可以使用 Firebug 的会话部分。
      【解决方案5】:

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

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

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

      【讨论】:

      • 设置为 subdomain.example.net 的显式域与未设置的域有什么区别?
      • 如果你设置它,你会在前面得到一个匹配所有子域的点,而不是只匹配当前子域
      【解决方案6】:

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

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

      【讨论】:

      • 如果您阅读了所有 RFC 6265,您会意识到拥有“仅主机”cookie 的唯一正确方法是不设置域属性。 tools.ietf.org/html/rfc6265#section-5.4
      • “拥有“host-only”cookie 的唯一正确方法是不设置域属性”不是 PHP 特有的,但这帮助我解决了仅从 HOST 切换时的问题cookie 到 x-subdomain cookie 并且我试图通过指定完整域来删除 javascript 中的仅主机 cookie,并且 JavaScript 在前面加上一个点,导致现有 cookie 的域不匹配,因此不会被删除。
      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2019-09-27
      • 2013-05-14
      • 1970-01-01
      • 2013-10-31
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多