setcookie 関数でクッキーを消すときはパスまで指定する
Posted on
- #php
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 の値を付けてクッキーが作られます。パスを指定して作ったクッキーを消すには削除するときにも明示的にパスを指定する、ということです。
ちゃんとマニュアルを読めという話ですね。