setcookie 関数でクッキーを消すときはパスまで指定する

Posted on

PHP でセッションクッキーを消すには setcookie 関数で過去の日付を指定します。今回はログアウト機能を実装していたのですが、セッションクッキーが削除できずハマりました。

まず確認したのは setcookie の戻り値。正常に実行されれば true が返ってきます。自分の書いたコードも true を返しており、途中でエラーを吐いて終了しているわけではありませんでした。

次に Firebug を使ってレスポンスヘッダを確認しましたが、レスポンスヘッダに Set-Cookie は存在します。ブラウザはレスポンスヘッダを受け取っているが、ほかの理由で削除できていないと推測しました。

あらためて PHP のマニュアルを確認してみると、省略可能な引数にパスの項目があります。この第 4 引数を省略していたのが原因でした。

// 第 4 引数を省略すると削除できない。
setcookie(session_name(), '', time() - 3600);

// 第 4 引数を指定すると削除できる。
setcookie(session_name(), '', time() - 3600, '/');

セッションクッキーは session_start 関数を実行した際に自動的に作られますが、このときに session.cookie_path の値を付けてクッキーが作られます。パスを指定して作ったクッキーを消すには削除するときにも明示的にパスを指定する、ということです。

ちゃんとマニュアルを読めという話ですね。