我在本地主机上。关于cookie和localhost上的会话的讨论很多。但是,我的情况似乎很特殊。我尝试以不同的方式设置Cookie,但似乎没有任何效果,即使$_SESSION
数组在设置会话变量后仍然为空。我尝试了以下组合以在本地主机上设置Cookie:
setcookie("name", "value")
setcookie("name", "value", 0)
setcookie("name", "value", 0, "/", false)
setcookie("name", "value", time()+86000, "/", false)
setcookie("name", "value", time()+86000)
setcookie("name", "value", time()+86000, ".localhost.com")
setcookie("name", "value", time()+86000, "localhost.com")
setcookie("name", "value", time()+86000, "localhost")
setcookie("name", "value", 0, "/", ".localhost.com")
setcookie("name", "value", 0, "/", ".localhost.com", false, false)
setcookie("name", "value", 0, "/", "localhost")
setcookie("name", "value", 0, "/", "localhost.com", false, false)
setcookie("name", "value", 0, "/", "localhost.com")
我还编辑了PHP.ini文件中的会话cookie值,以反映我对setcookie
的徒劳尝试。我还尝试了所有尝试将路径从“ /”更改为“ / user”。
我在Apache 2.4.33上使用PHP 7.1,并配置了一个“ localhost.com”以指向服务器文档根目录上的目录“ / app_support”。我还配置了“ app.localhost.com”以指向“ / subdomains / app”目录,该目录也在服务器的根目录上。我正在通过“ app.localhost.com”访问我的站点,然后使用AJAX访问“ localhost.com/user”。在“ localhost.com/user”目录上,有“ user.php”,这是一个带有用户类的文件,我用于登录和设置Cookie。
我已经在Firefox 60中验证过,正在为我的自定义Cookie和会话Cookie发送Cookie标头,因此很明显是由于某种原因浏览器拒绝了它们。我在Chrome 68和Chromium 66中得到了相同的结果。
编辑:这是我要设置Cookie的部分。
session_regenerate_id();
$_SESSION['user']['id'] = $user['investor_id'];
$_SESSION['user']['surname'] = $user['surname'];
$_SESSION['user']['name'] = $user['given_name'];
$_SESSION['user']['email'] = $user['email'];
$selector = $this->generateCode(9);
$authenticator = $this->generateCode(33);
$expiry = time() + 2592000;
setcookie("logged_in", $selector.':'.$authenticator, $expiry, '/', '.localhost.com');
编辑2 :在Firefox上,这是收到的Cookie标头:
logged_in
domain .localhost.com
expires 2018-09-15T08:35:07.000Z
path /
value F668B2928:417076134356498468FDA03D496336BDA
PHPSESSID
domain localhost.com
httpOnly true
path /user
value 77h432cjgu25mrnauktnc6s471
答案 0 :(得分:0)
因此,事实证明我的问题实际上是特殊的,因为它与PHP无关。 Cookie的问题是因为我正在通过JQuery.ajax
访问设置cookie的页面,由于CORS规定,浏览器自动拒绝了here讨论的cookie。由于我是从子域发送请求,因此我的请求被认为是跨域的。解决方案不是在PHP中,而是在客户端上,如this answer中所示。但是,如果通过应用该解决方案保留'x-requested-with'标头对您很有用,则必须手动设置标头,如this answer所示。