代码之家  ›  专栏  ›  技术社区  ›  Eli

PHP:Cookie域/子域控件

  •  28
  • Eli  · 技术社区  · 17 年前

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

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

    如果我这样做:

    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(注意开头的点),我相信这意味着“匹配所有子域(或者在本例中是子域)”。

    你知道这是什么原因吗?我能做些什么来控制这个预弯点?

    谢谢

    5 回复  |  直到 17 年前
        1
  •  24
  •   Brian Fisher    17 年前

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

    header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net");
    
        2
  •  22
  •   Kevin Campion    17 年前

    http://subdomain.example.net 不要使用域参数

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

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

        3
  •  14
  •   Community Mohan Dere    5 年前

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

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

        4
  •  11
  •   Alex    14 年前

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

    避免领先。在子域前面,Kevin和stolsvik没有设置域属性。

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

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

        5
  •  2
  •   Luciano Camilo    15 年前

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

    希望这能节省一些时间!

        6
  •  0
  •   Gendrith    7 年前

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

    $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
    
    setcookie("cookie_name", 'cookie_value', 0, '/', $domain);
    
    推荐文章