簡體   English   中英

如何設置 cookie,然后在 PHP 中重定向?

[英]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 存在一個已知錯誤。

http://support.microsoft.com/kb/q176113/

我能夠通過在刷新 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM