7

我一直在尝试找到一种跨多个子域共享 cookie 的方法。

像这样设置cookie:

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', '.mydomain.com');

正是这样做的。但是这里有一个小问题。这将在所有子域之间共享 cookie。

我的问题是我在 2 个子域上设置了其他环境(开发和测试)。我正在寻找一种在“选择性”子域之间共享 cookie 的方法。即在某些子域之间共享,而不是在其他子域中共享。我不确定是否存在这样的事情。

任何帮助表示赞赏。谢谢。

4

4 回答 4

1

据我所知,您可以使用“.mydomain.com”(正如您所做的那样)在所有子域之间共享,或者您必须具体并仅使用一个子域,例如“test.mydomain.com” .

您还可以使用一些技巧或解决方法,例如为 cookie 名称添加前缀,然后执行逻辑服务器端,但我不确定这是否是您正在寻找的解决方案。

于 2012-08-14T15:46:48.990 回答
0

在对它进行了很多思考和研究并阅读了上面发布的所有有价值的评论之后,我想没有直接的解决方案。

我本可以采用 Adrien Hingert 提供的解决方案,但这意味着每次用户进来时都要进行额外的检查。

我想我别无选择,只能将我的开发和测试环境移动到另一个域。

非常感谢你们所有人的想法。

于 2012-08-18T02:05:27.863 回答
0

该属性domain=.example.com专门使所有子域都可以使用 cookie。只需删除该属性,cookie 就只能由设置它的子域读取。

就这么容易。

于 2013-04-06T14:42:23.913 回答
0

在我的开发计划中,节目和 UI 都出现了类似的问题。在这里撞了我的头之后,那里很明显。

让我们分解一下,有一个来自特定域的setter aka php 脚本,并且有一个sender aka browser,它在每次从浏览器到域的调用时发送 cookie。

我们还知道,一旦 php 脚本完成处理,它就会失去与浏览器的连接,并为每个说的新调用打开线程。

然而,Broswer 使用 cookie 的到期日期来确定哪些内容要保存在缓存中,哪些内容不应该保存在缓存中。基于什么保持它kees将数据耦合到每个调用。

我们打算做的是让脚本告诉浏览器将 cokkie 发送到哪个域以及不将 cookie 发送到哪个域。

规范说只有作为设置者的域才会从发送者那里接收 cookie。如果不是这样,那我们就麻烦大了。巨大的黑客网关在这里和那里泛滥。

基于上面的 virture 的 php cookie 函数只执行一个操作是的,我们可以在这里和那里正则表达式位,它只执行单个操作。

例如

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', 'mydomain.com');

以上代码仅按照功能输出规则执行一组指令。函数不能同时输出两个输出。

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', '.mydomain.com');

第二个代码也执行单输出,即使 “.mydomain.com”是浏览器的单输出指令。是浏览器解释如何处理它而不是 php 代码。

现在,如果我们需要非常谨慎,我们要么必须执行两个功能性放置,例如

setcookie('token', base64_encode(serialize($token)), time()+10800, '/', 'dev.mydomain.com');


setcookie('token', base64_encode(serialize($token)), time()+10800, '/', 'prod.mydomain.com');

上面的代码将运行两个单独的指令,并将cookies限制在选择性域中,浏览器也是如此。

如果我们使用 reklativesetcookie('token', base64_encode(serialize($token)), time()+10800, '/', '.mydomain.com');那么浏览器会将它用作通配符,老实说浏览器不知道它是选择性的还是 wikd 卡。

因此,唯一的选择是,它有它的优点,我们需要重新编排我们的业务逻辑,而不仅仅是依赖通配符或通用单一输出。即使有一个函数,它也会运行各种逻辑。

    function newCookie ($name,$value = "",$expires = 0,$path = "/",$domain = "",$secure = false,$httponly = false){
    
    if (is_array($domain) && sizeof($domain)>> 0){
    
    foreach ($domain as $value) { 
        setcookie($name,$value,$expires,$path,$value,$secure,$httponly);
    }
    
    
    } else {
    setcookie($name,$value,$expires,$path,$domain,$secure,$httponly);
    }
    
    };
    
    newCookie('token', base64_encode(serialize($token_value)), time()+10800, '/', ['prod.mydomain.com', 'dev.mydomain.com']);
 or simply function newCookie ($name,$value = "",$expires = 0,$path = "/",$domain = "",$secure = false,$httponly = false){

if (is_array($domain) && sizeof($domain)>> 0){

foreach ($domain as $value) { 
    setcookie($name,$value,$expires,$path,$value,$secure,$httponly);
}


} else {
setcookie($name,$value,$expires,$path,$domain,$secure,$httponly);
}

    };

    newCookie('token', base64_encode(serialize($token_value)), time()+10800, '/', 'dev.mydomain.com');

底线是必须更新您的业务逻辑,如上例所示,只需执行一次,它应该可以正常工作,并且浏览器会准确地知道该做什么。

于 2022-01-03T08:11:58.563 回答