web-dev-qa-db-ja.com

Cookieを設定してPHPでリダイレクトするにはどうすればよいですか?

少し処理した後、ユーザー入力にCookieの値を設定し、それらを新しいページにリダイレクトします。ただし、Cookieは設定されません。リダイレクトをコメントアウトすると、Cookieは正常に設定されます。これは何らかのヘッダーの問題だと思います。この状況に最適な回避策は何ですか?

if($form_submitted) {
    ...
    setcookie('type_id', $new_type_id, time() + 60*60*24*30);
    header("Location: $url");
    exit;
}

どちらの場合でもsetcookieはtrueを返し、エラー/警告/通知が表示されないことに注意してください。

編集: Unix/Apache/MySQL/PHPを使用しています

41
Wickethewok

人間の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;
}

From PHP manual:

Cookieを使用できるサーバー上のパス。 「/」に設定すると、Cookieはドメイン全体で使用可能になります。 '/ foo /'に設定すると、Cookieは/ foo /ディレクトリおよびdomainの/ foo/bar /などのすべてのサブディレクトリ内でのみ使用可能になります。デフォルト値は、Cookieが設定されている現在のディレクトリです。

72
Glavić

IISを実行していると思いますか?同じリクエストでCookieとロケーションヘッダーの両方を設定しようとすると、IISバージョン7未満の既知のバグがあります。

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

4

リフレッシュヘッダーにわずかな遅延を使用することで、この問題を解決できました。ヘッダーを設定し(setcookieなど、出力される可能性のあるメソッドの前に行う必要があります)、次にcookieを設定します。これらの数秒間ユーザーに空白の画面が表示されないように、メッセージを追加しました。

    header("refresh: 2; url=$url");
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
    echo "Processing, please wait...";
2
atonyc

Cookieが設定されている場合、どのようにテストしていますか? Cookieは、設定後にnextページで利用できます。

よくある落とし穴:

Cookieは、Cookieを表示するページを次にロードするまで表示されません。 Cookieが正常に設定されたかどうかをテストするには、Cookieの有効期限が切れる前に、次の読み込みページでCookieを確認します。有効期限は、expireパラメーターによって設定されます。 Cookieの存在をデバッグする良い方法は、単にprint_r($ _ COOKIE);を呼び出すことです。

2
tkotitan

ヘッダーで相対URLを使用します。

@Header("Location: orders_9090_1.php");
0
Ondrej Konrady