setcook ie () работает на локальном хосте, но не работает на производстве (domain.com) - PullRequest
0 голосов
/ 02 мая 2020

У меня возникли некоторые проблемы, связанные с setcookie() в php. setcookie() отлично работает на локальном хосте, но не на живом домене. вот как я настраиваюсь в localhost.

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");
            }
        }
    });

Заголовок в 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");

PS: я думаю, что я уже искал весь сайт. но ничего не нашел по этому вопросу

Редактировать: Это строки до setcookie. они выполняются после установки заголовка, о котором я уже упоминал ранее

 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);

1 Ответ

0 голосов
/ 02 мая 2020

setcookie не в состоянии фактически установить повара ie, поскольку заголовки уже отправлены. Файлы cookie устанавливаются в ответах HTTP с использованием заголовка Set-Cookie.

У вас есть сценарий PHP, выводящий содержимое до вашего вызова setcookie. Не видя весь ваш проект, невозможно точно определить, где именно. Обычно причиной этого является сохранение файлов с дополнительными символами после закрытия тегов PHP в конце файла (это распространенная проблема). Вам нужно будет найти и удалить эти дополнительные символы (если они посторонние). В противном случае вам потребуется реорганизовать логи c, чтобы setcookie можно было вызывать раньше.

Единственным другим вариантом будет включение буферизации вывода . Это предотвратит немедленную отправку вывода; он будет буферизован в памяти и будет отправлен, когда запрос будет завершен, если вы явно не отправите его ранее. Это полезно в различных случаях, но на самом деле это только обходной путь для проблемы root.

В вашем случае, поскольку это происходит только в одной среде, я бы начал с рассмотрения любой среды, специфицированной c код / ​​конфигурация (которая звучит так, как у вас). Возможно, ваш процесс развертывания / сборки добавляет дополнительные символы при развертывании в проблемную среду c.

...