【PHPあるいはJavaScript】ログアウトした後で、ブラウザの戻るボタンを押してもキャッシュの前画面が表示されないようにしたい。

解決済

回答 5

投稿

  • 評価
  • クリップ 3
  • VIEW 7,472

Satochan24

score 84

パスワード管理で、ログインして使用する管理画面を作りまして、
ログアウトすると、最初のログイン画面に戻る仕様にしました。
しかし、ブラウザの戻るボタンを押すと、ログアウト前の管理画面が表示されてしまいます。
Webメールとかでは、よくログアウト後に戻るボタンを押してもログイン画面のままになるのを
みかけますが、どのような処理で実現可能でしょうか?

因みに、ログインは、パスワードだけを入力させ、
ログインしているかどうかは、セッションの時間(1時間)で
判断しています。

Webで調べて、ページをキャッシュさせない処理を追加して
みましたが、うまくいきませんでした。

以下、ログインとログイン後の管理画面、ログアウトのPHPファイルの一部です。

【login.php】の一部
<?php
//ページをキャッシュさせない
session_cache_limiter('nocache');

session_start();

if (!empty($_POST)) {
    // ログインの処理
    if ($_POST['password'] != '') {
        if ($_POST['password'] == 'test') {
            // ログイン成功
            $_SESSION['time'] = time();

        header('Location: kanri.php');
        exit();
        } else {
            $error['login'] = 'failed';
        }
    } else {
        $error['login'] = 'blank';
    }
}
?>

【kanri.php】ログイン後の管理画面の一部
<?php
//ページをキャッシュさせない
session_cache_limiter('nocache');

session_start();

if ($_SESSION['time'] + 3600 > time()) {
    // ログインしている
    $_SESSION['time'] = time();

    } else {
    // ログインしていない
    //header('Location: login.php');
    //exit();
}
?>

【logout.php】の一部 
※書籍を参考にしたので、不要な部分があるかもしれません。
<?php
//ページをキャッシュさせない
session_cache_limiter('none');
session_start();

// セッション情報を削除
$_SESSION = array();
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
session_destroy();

// Cookie情報も削除
//setcookie('email', '', time()-3600);
setcookie('password', '', time()-3600);

header('Location: login.php');
exit();
?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

どこまでキャッシュするかはブラウザの仕様次第なので、
完全に制御したい場合はログアウト後のタイミングでブラウザが閉じるようにするしかありません。
(厳密にはそれでも難しい、例えばオフラインモードを搭載しているようなブラウザだと意図的にchache controlを無視するような仕様もあり得る)

が、そこまでやる必要が無いのであれば、
ログアウト後にログインページへのリダイレクトを実行するようにして、
それより先のページで戻るボタンを押してもログアウトページを通る(ログインしていない状態でログインページを踏んでも再度ログインページにリダイレクトする)様にすることで、単純な「戻る」に対しては対応可能です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/02 17:04

    回答有難うございます。検証しようかと思ったんですが、
    kanri.php から logout_complete.php さらに logout.phpに遷移させるということでしょうか?そして、logout_complete.phpにアクセスした場合、login.phpに遷移させる。
    その場合、通常のログアウトで、どうやってlogout_complete.php から logout.phpに遷移させればい良いでしょうか?セッションの有無を確認して、有った場合のみ、logout.phpに遷移とかでしょうか?

    キャンセル

  • 2015/12/02 18:06 編集

    意図としてはこんな感じです。
    kannri.php

    logout.php→未ログイン時は直接アクセスとみなしてlogin.phpにリダイレクト
    (ログアウト処理をするだけで表示はしない)
    ↓headerによるリダイレクト
    logount_complete.php
    ・リファラーを確認して、logout.phpからの移行なら「ログアウトしました」表示
    *リファラーは偽装可能ですが、このケースの場合は偽装されても困らないのでよしとする
    ・logout.php以外からのアクセスなら、直接アクセスと判断してlogin.phpに移行する

    キャンセル

  • 2015/12/03 15:33

    試してみました。
    結果は…最初のコメントに記述したスクリプト入れた結果とほとんど同じでした。
    (遷移前に戻るを押すと管理画面が見えるが、遷移後は戻るを押しても管理画面には戻れない)
    また、リファラーを確認したら、headerでリダイレクトさせたら、
    リファラーの $_SERVER["HTTP_REFERER"]
    は、kanri.phpを指していました。。。
    やはり、最初のスクリプトに戻そうかなぁという状況です。

    キャンセル

+1

キャッシュ制御は HTTP の領分です。
HTTP 1.0 ならば Pragma があり、HTTP 1.1 なら Cache-Control があります。

14.9 Cache-Control - ハイパーテキスト転送プロトコル -- HTTP/1.1
14.32 Pragma - ハイパーテキスト転送プロトコル -- HTTP/1.1

Cache-Control: no-cache
Pragma: no-cache

jiu3bao3 さんも指摘されていますが、session_destroy() を実行していればセッションは破棄される為、[戻る] 事は出来ても正常に動作しないはずです。
また、セッションを破棄したという事でセッションが存在するかを確認すれば、正常処理か判断できるという事でもあります。
従って、セッションがなければログイン画面にリダイレクトさせればいいでしょう。
PHP: session_destroy - Manual

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/02 17:51

    その通りです。admin.phpではなく、kanri.phpですが…

    とりあえず、logout.phpに下記のコード書いたら、遷移される前だと管理画面が見えますが、2秒待って遷移された後だと、もう管理画面の戻れなくなったので、これで(完璧ではないですが、)進めようかなぁ…と思っています。

    <script>
    <!--
    // 一定時間経過後に指定ページにジャンプする
    mnt = 2; // 何秒後に移動するか?
    url = "login.php"; // 移動するアドレス
    function jumpPage() {
    location.href = url;
    }
    setTimeout("jumpPage()",mnt*1000)
    //-->
    </script>

    キャンセル

  • 2015/12/02 18:04 編集

    とりあえず、kanri.php で session_status() と PHP_SESSION_ACTIVE を出力してみたり、$_SESSION[] の中身を出力して確認したみる事から始めてみるといいんじゃないかと思います。

    キャンセル

  • 2015/12/02 18:11

    回答有難うございました。
    明日、もう少しだけ確認してみます。

    キャンセル

+1

管理画面が単純な一つのHTMLページでできているか、シングルページアプリケーションである場合、「ログアウト」のボタンのクリックイベントのハンドラに次のように記述する方法があります。

location.replace('logout.php');

location.replace() を使うと、現在のページをページヒストリーから削除した上で目的のページへジャンプすることができます。このため、logout.phpを表示した状態で「戻る」ボタンを押しても、管理画面には戻れなくなります。
詳しくはMDNの説明をご覧ください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/02 13:35

    回答有難うございます。
    こんな感じでしょうか?

    <script>
    FunctionName(){
    location.replace('logout.php');
    }
    </script>
    <html>
    <a onclick="FunctionName();">ログアウト</a>
    </html>

    キャンセル

  • 2015/12/02 17:34

    はい、それでいいと思います。

    キャンセル

  • 2015/12/08 14:07

    こんにちは。location.replace() をはじめて知りました。有用そうですね。
    http://www.pori2.net/js/location/4.html

    キャンセル

check解決した方法

0

いろいろ、回答頂いたのですが、最終的に、logout.phpに下記のスクリプトを入れれば、 リダイレクト後には管理画面まで戻れないことが確認できましたので、 これで解決としたいと思いいます。

<script>
<!--
// 一定時間経過後に指定ページにジャンプする
mnt = 2; // 何秒後に移動するか?
url = "login.php"; // 移動するアドレス
function jumpPage() {
   location.href = url;
}
 setTimeout("jumpPage()",mnt*1000)
 //-->
</script>
<html><body>
<p>ログアウトしました。</p>
</body></html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

ログアウトでession_destroy()を呼出してみてはどうでしょう? 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/01 15:54

    回答有難うございます。
    logout.phpのなかに、session_destroy()記入してありまして、
    ログアウト自体はできている(管理画面内の操作はできない)のですが、キャッシュ(と思われる)画面が表示できてしまいます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 【PHPあるいはJavaScript】ログアウトした後で、ブラウザの戻るボタンを押してもキャッシュの前画面が表示されないようにしたい。