重定向时无法存入Session的问题排查与解决请求
Hey, I've looked through your code and spotted the key issues causing your Session storage problem during redirects. Let's break this down and fix it step by step:
The Core Problem
When you redirect after setting Session data, your PHP script continues to run instead of terminating immediately. This can prevent the Session data from being properly written to storage before the redirect completes. Additionally, your redirect function isn't consistent with HTTP status codes, which might contribute to unexpected behavior.
Fix 1: Update the redirect Helper Function
The most critical fix is to terminate the script right after sending the redirect header. Add exit (or die()) to ensure no further code runs, giving PHP time to persist the Session data. Also, standardize the 303 status code for all redirects:
function redirect($url){ if (substr($url,0,4)==="http"){ header("Location:".$url, true, 303); } else { header("Location:".APP_URL."/".$url, true, 303); } exit; // Stop script execution immediately after redirect }
Fix 2: Ensure Session is Started Correctly
Double-check that session_start() is called before any output in your application's entry point (like index.php). If your \Core\Session class handles this automatically, you're good to go—but if not, adding session_start() at the very top of your main script is mandatory for using $_SESSION.
Optional: Improve the session Helper Function
Your current helper only supports top-level Session keys, which works for your error messages but isn't flexible for nested data like $_SESSION['auth']. Here's a more robust version that handles nested keys (e.g., session('auth.user', 'John')):
function session($name = null, $message = null){ if (is_null($name) && is_null($message)){ return new \Core\Session(); } else { // Handle nested Session keys using dot notation $keys = explode('.', $name); $sessionReference = &$_SESSION; foreach ($keys as $key) { if (!isset($sessionReference[$key])) { $sessionReference[$key] = []; } $sessionReference = &$sessionReference[$key]; } $sessionReference = $message; } }
Optional: Force Session Write (If Issues Persist)
If you still run into problems, you can manually trigger a Session write before redirecting to ensure data is saved immediately:
public function makeLogin(){ $model = new User(); $user = $model->read()->where("username","=",post("username"))->first(); if(password_verify(post("password"),$user['password'])){ $_SESSION['auth']['user'] = $user['name']; $_SESSION['auth']['username'] = $user['username']; $_SESSION['auth']['user_role'] = $user['user_role']; session_write_close(); // Force Session data to be written return redirect('redirect-core'); } else { session("message","wrong username or password"); session("message_type","danger"); session_write_close(); return redirect(ref_url()); } }
Final Notes
The main culprit here is the missing exit in your redirect function. Once you add that, your Session data should persist correctly during redirects, just like it does when rendering views directly.
内容的提问来源于stack exchange,提问作者Elliot

