我正在使用此处找到的登录脚本的略微修改版本,并且遇到了我认为来自我不理解的 session_set_cookie_params() 的行为。
我正在使用会话、cookie 和 header() 将用户重定向到登录页面,然后返回到他们请求的页面。我的问题是,即使初始页面和登录页面使用相同的函数来处理会话和 cookie,也设置了两个单独的 cookie;一个用于 www.example.com,一个用于 example.com。这阻止了登录后读取初始页面上设置的会话变量。
以下是来自任何请求页面的代码示例:
requireSSL();
sec_session_start();
if(login_check($mysqli) == false) {
    $_SESSION['origURL'] = $_SERVER['REQUEST_URI'];
    header('Location: https://www.example.com/login.php');
    exit();
}
以下是功能:
function requireSSL() {
    if($_SERVER["HTTPS"] != "on") {
        header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
        exit();
    }
}
function sec_session_start() {
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = true; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 
    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
    session_name($session_name); // Sets the session name to the one set above.
    session_start(); // Start the php session
    session_regenerate_id(true); // regenerated the session, delete the old one.     
}
虽然我能够通过在 session_set_cookie_params() 中明确声明一个域(例如“example.com”)来“修复”这种行为,但我很想了解为什么首先设置了两个 cookie。谢谢!