【PHPあるいはJavaScript】ログアウトした後で、ブラウザの戻るボタンを押してもキャッシュの前画面が表示されないようにしたい。
解決済
回答 5
投稿
- 評価
- クリップ 3
- VIEW 11K+
ログアウトすると、最初のログイン画面に戻る仕様にしました。
しかし、ブラウザの戻るボタンを押すと、ログアウト前の管理画面が表示されてしまいます。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
完全に制御したい場合はログアウト後のタイミングでブラウザが閉じるようにするしかありません。
(厳密にはそれでも難しい、例えばオフラインモードを搭載しているようなブラウザだと意図的にchache controlを無視するような仕様もあり得る)
が、そこまでやる必要が無いのであれば、
ログアウト後にログインページへのリダイレクトを実行するようにして、
それより先のページで戻るボタンを押してもログアウトページを通る(ログインしていない状態でログインページを踏んでも再度ログインページにリダイレクトする)様にすることで、単純な「戻る」に対しては対応可能です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
location.replace('logout.php');
location.replace() を使うと、現在のページをページヒストリーから削除した上で目的のページへジャンプすることができます。このため、logout.phpを表示した状態で「戻る」ボタンを押しても、管理画面には戻れなくなります。
詳しくはMDNの説明をご覧ください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
いろいろ、回答頂いたのですが、最終的に、logout.phpに下記のスクリプトを入れれば、 リダイレクト後には管理画面まで戻れないことが確認できましたので、 これで解決としたいと思いいます。
<script></script>
<html><body>
<p>ログアウトしました。</p>
</body></html>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/12/01 18:22
とりあえず、logout.phpを「ログアウトしました。」と表示させるページに変更して
下記のようなスクリプトを追加しました。
そしたら、遷移前に戻るを押すと画面表示されちゃいますが、遷移後は殆ど戻れなくなりましたので、これである程度は制御できてるかなという感じです。
<script>
<!--
// 一定時間経過後に指定ページにジャンプする
mnt = 3; // 何秒後に移動するか?
url = "login.php"; // 移動するアドレス
function jumpPage() {
location.href = url;
}
setTimeout("jumpPage()",mnt*1000)
//-->
</script>
2015/12/01 18:33
ログアウトのスクリプトのPHP側に
header('location: リダイレクト先');
exit();
という感じでリダイレクトさせてあげればOKです。
2015/12/01 18:54
最初の投稿のlogout.phpを見てもらえば分かるように、その処理を入れてました。
でもそれだと、logout.phpの画面表示もされず(無理に表示する必要はありませんが…)普通に戻れてしまったので、上記処理に変更し、多少マシになりました。
2015/12/01 19:08
失礼しました。
2015/12/01 22:49
logout_complete.phpに直接アクセスされたら問答無用でトップやログインページにリダイレクトするような処理を一緒に入れておけばいいかと思います。
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を指していました。。。
やはり、最初のスクリプトに戻そうかなぁという状況です。