在我的开发计划中,节目和 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');
底线是必须更新您的业务逻辑,如上例所示,只需执行一次,它应该可以正常工作,并且浏览器会准确地知道该做什么。