[英]How can I set a cookie and then redirect in PHP?
經過一些處理后,我想為用戶輸入設置一個 cookie 值,然后將它們重定向到一個新頁面。 但是,cookie 沒有被設置。 如果我注釋掉重定向,則 cookie 設置成功。 我認為這是某種 header 問題。 這種情況的最佳解決方法是什么?
if($form_submitted) {
...
setcookie('type_id', $new_type_id, time() + 60*60*24*30);
header("Location: $url");
exit;
}
請注意,無論哪種情況,setcookie 都會返回true
,並且我沒有收到任何錯誤/警告/通知。
編輯:我正在使用 Unix/Apache/MySQL/PHP
如果您有人工 url 或子文件夾(如 www.domain.com/path1/path2/),那么您必須將 cookie 路徑設置為 / 以適用於所有路徑,而不僅僅是當前路徑。
if($form_submitted) {
...
setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
header("Location: $url");
exit;
}
來自 PHP 手冊:
cookie 可用的服務器上的路徑。 如果設置為“/”,cookie 將在整個域中可用。 如果設置為 '/foo/',cookie 將僅在 /foo/ 目錄和域的 /foo/bar/ 等所有子目錄中可用。 默認值是設置 cookie 的當前目錄。
您如何測試 cookie 是否已設置? Cookies 設置后在下一頁可用。
常見的陷阱:
Cookies 在下一次加載 cookie 應該可見的頁面之前不會變為可見。 要測試 cookie 是否設置成功,請在 cookie 過期之前檢查下一個加載頁面上的 cookie。 過期時間通過 expire 參數設置。 調試 cookies 存在的一個好方法是簡單地調用 print_r($_COOKIE);。
我假設您正在運行 IIS? 嘗試在同一請求中同時設置 cookie 和位置 header 時,IIS 版本小於 7 存在一個已知錯誤。
我能夠通過在刷新 header 中使用輕微延遲來解決這個問題。 我們設置 header(必須在任何可能 output 的方法之前完成,如 setcookie),然后設置 cookies。 我添加了一條消息,以便用戶在那幾秒鍾內看不到空白屏幕。
header("refresh: 2; url=$url");
setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
echo "Processing, please wait...";
在 header 中使用相對的 URL:
@Header("Location: orders_9090_1.php");
我已經為此制定了解決方案
setcookie(self::SESSION_NAME, $session_id, $expires, '/', null, null, true);
header("Set-cookie: ".self::SESSION_NAME."=".$session_id."; expires=".date('D, Y-M-d H:i:s', $expires)." GMT; path=/; HttpOnly; secure=true; SameSite=Strict");
//check is something printed
if (!headers_sent()) {
//is there any header set
if( !array_map(function($header){ return preg_match('/Set-cookie/i', $header) ? true : null; }, headers_list()) ){
die(header('Location: ' . $url));
}
}
die('<script type="text/javascript">window.location.href = ' . ($append ? 'window.location.href' : '') . ($append && $url ? '+' : '') . ($url ? '"' . $url . '"' : '') . ';</script>');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.