setcookie() 在本地主机上工作但不在生产环境中工作 (domain.com)
setcookie() working on localhost but not working on production (domain.com)
我在 php 中遇到了一些关于 setcookie()
的问题。 setcookie()
在本地主机上运行良好
但不在活动域上。这是我在 localhost 中的设置方式。
本地主机
setcookie("private_token",$jwt,$expire_claim,"/","",false,true);
域
setcookie("private_token",$jwt,$expire_claim,"/","domain.com",false,true);
Ajax 调用
$.ajax({
url: "includes/api/userAPI.php",
type: 'POST',
data: data,
xhrFields: {
withCredentials: true
},
crossDomain: true,
success: function (res, text, code) {
if (code.status == 200) {
window.location.replace("landing.php");
} else {
alert("something went wrong");
}
},
error: function (res) {
if (res.status == 401) {
alert("failed to authorize");
}
}
});
Header 在 PHP
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
P.S:我想我已经搜索了整个网站。但还没有找到关于此事的任何信息
编辑:
这些是 setcookie
之前的行。这些是在设置 header 之后执行的,我之前已经提到过
SELF::$connection = Parent::getConnection();
$str = "select * from user where col=?";
$query = SELF::$connection->prepare($str);
$array = array($user->__get('col'));
$query->execute($array);
$row = $query->fetch(PDO::FETCH_ASSOC);
$session = new session();
$session->set_session($row['id']);
$id = $row["id"];
$username = $row["user"];
$password = $user->__get("pass");
$email = $user->__get("mail");
$hash = $row['pass'];
if(password_verify($password,$hash))
{
$secret_key = "dummy";
$issuer_claim = "THE_ISSUER"; // this can be the servername
$audience_claim = "THE_AUDIENCE";
$issuedat_claim = time(); // issued at
$expire_claim = strtotime('+1 day', $issuedat_claim);; // expire time in seconds
$token = array(
"iss" => $issuer_claim,
"aud" => $audience_claim,
"iat" => $issuedat_claim,
//u "nbf" => $notbefore_claim,
"exp" => $expire_claim,
"data" => array(
"id" => $id,
"username" => $username,
"email" => $email
));
现在我在响应中收到以下错误
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at <file directory where setcookie has been called>:74) in <b><file directory where setcookie has been called></b> on line <b>77</b><br />
第 74 行"expireAt" => $expire_claim
第 77 行 setcookie("private_token",$jwt,$expire_claim,"/","domain.com",false,true);
setcookie
未能实际设置 cookie,因为 headers 已经发送。使用 Set-Cookie
header.
在 HTTP 响应中设置 Cookie
在 setcookie
调用之前,您有 PHP 个脚本输出内容。如果不查看您的整个项目,就无法确定具体位置。通常,造成这种情况的原因是在文件末尾关闭 PHP 标记后,文件保存了额外的字符(这是一个常见问题)。您将需要找到并删除这些额外的字符(假设它们是无关的)。否则,您将需要重构您的逻辑,以便可以更早地调用 setcookie
。
唯一的其他选择是启用 output buffering。这将防止立即发送输出;它将被缓冲在内存中并在请求完成时发送,除非您提前明确发送它。这在各种情况下都很有用,但实际上只是解决这里根本问题的一种解决方法。
在您的情况下,由于这只发生在一个环境中,因此我将首先审查任何特定的环境 code/configuration(听起来您有)。也可能是您的 deployment/build 进程在部署到有问题的环境时添加了额外的字符。
我在 php 中遇到了一些关于 setcookie()
的问题。 setcookie()
在本地主机上运行良好
但不在活动域上。这是我在 localhost 中的设置方式。
本地主机
setcookie("private_token",$jwt,$expire_claim,"/","",false,true);
域
setcookie("private_token",$jwt,$expire_claim,"/","domain.com",false,true);
Ajax 调用
$.ajax({
url: "includes/api/userAPI.php",
type: 'POST',
data: data,
xhrFields: {
withCredentials: true
},
crossDomain: true,
success: function (res, text, code) {
if (code.status == 200) {
window.location.replace("landing.php");
} else {
alert("something went wrong");
}
},
error: function (res) {
if (res.status == 401) {
alert("failed to authorize");
}
}
});
Header 在 PHP
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
P.S:我想我已经搜索了整个网站。但还没有找到关于此事的任何信息
编辑:
这些是 setcookie
之前的行。这些是在设置 header 之后执行的,我之前已经提到过
SELF::$connection = Parent::getConnection();
$str = "select * from user where col=?";
$query = SELF::$connection->prepare($str);
$array = array($user->__get('col'));
$query->execute($array);
$row = $query->fetch(PDO::FETCH_ASSOC);
$session = new session();
$session->set_session($row['id']);
$id = $row["id"];
$username = $row["user"];
$password = $user->__get("pass");
$email = $user->__get("mail");
$hash = $row['pass'];
if(password_verify($password,$hash))
{
$secret_key = "dummy";
$issuer_claim = "THE_ISSUER"; // this can be the servername
$audience_claim = "THE_AUDIENCE";
$issuedat_claim = time(); // issued at
$expire_claim = strtotime('+1 day', $issuedat_claim);; // expire time in seconds
$token = array(
"iss" => $issuer_claim,
"aud" => $audience_claim,
"iat" => $issuedat_claim,
//u "nbf" => $notbefore_claim,
"exp" => $expire_claim,
"data" => array(
"id" => $id,
"username" => $username,
"email" => $email
));
现在我在响应中收到以下错误
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at <file directory where setcookie has been called>:74) in <b><file directory where setcookie has been called></b> on line <b>77</b><br />
第 74 行"expireAt" => $expire_claim
第 77 行 setcookie("private_token",$jwt,$expire_claim,"/","domain.com",false,true);
setcookie
未能实际设置 cookie,因为 headers 已经发送。使用 Set-Cookie
header.
在 setcookie
调用之前,您有 PHP 个脚本输出内容。如果不查看您的整个项目,就无法确定具体位置。通常,造成这种情况的原因是在文件末尾关闭 PHP 标记后,文件保存了额外的字符(这是一个常见问题)。您将需要找到并删除这些额外的字符(假设它们是无关的)。否则,您将需要重构您的逻辑,以便可以更早地调用 setcookie
。
唯一的其他选择是启用 output buffering。这将防止立即发送输出;它将被缓冲在内存中并在请求完成时发送,除非您提前明确发送它。这在各种情况下都很有用,但实际上只是解决这里根本问题的一种解决方法。
在您的情况下,由于这只发生在一个环境中,因此我将首先审查任何特定的环境 code/configuration(听起来您有)。也可能是您的 deployment/build 进程在部署到有问题的环境时添加了额外的字符。