質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

19511閲覧

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

Satochan24

総合スコア113

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

3クリップ

投稿2015/12/01 06:43

パスワード管理で、ログインして使用する管理画面を作りまして、
ログアウトすると、最初のログイン画面に戻る仕様にしました。
しかし、ブラウザの戻るボタンを押すと、ログアウト前の管理画面が表示されてしまいます。
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(); ?>
ikuwow👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

投稿2015/12/01 08:11

編集2015/12/01 09:04
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/12/01 09:22

回答有難うございます。 とりあえず、logout.phpを「ログアウトしました。」と表示させるページに変更して 下記のようなスクリプトを追加しました。 そしたら、遷移前に戻るを押すと画面表示されちゃいますが、遷移後は殆ど戻れなくなりましたので、これである程度は制御できてるかなという感じです。 <script> <!-- // 一定時間経過後に指定ページにジャンプする mnt = 3; // 何秒後に移動するか? url = "login.php"; // 移動するアドレス function jumpPage() { location.href = url; } setTimeout("jumpPage()",mnt*1000) //--> </script>
tanat

2015/12/01 09:33

遷移前に戻るを押せない様にするのであれば、 ログアウトのスクリプトのPHP側に header('location: リダイレクト先'); exit(); という感じでリダイレクトさせてあげればOKです。
Satochan24

2015/12/01 09:54

回答有難うございます。 最初の投稿のlogout.phpを見てもらえば分かるように、その処理を入れてました。 でもそれだと、logout.phpの画面表示もされず(無理に表示する必要はありませんが…)普通に戻れてしまったので、上記処理に変更し、多少マシになりました。
tanat

2015/12/01 10:08

あ、そうですね。 失礼しました。
tanat

2015/12/01 13:49

よくあるのは、logout_complete.phpみたいな画面をもう一つ挟んで、そこにリダイレクトするような方法でしょうか。 logout_complete.phpに直接アクセスされたら問答無用でトップやログインページにリダイレクトするような処理を一緒に入れておけばいいかと思います。
Satochan24

2015/12/02 08:04

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

2015/12/02 09:10 編集

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

2015/12/03 06:33

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

0

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

JavaScript

1location.replace('logout.php');

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

投稿2015/12/01 11:36

編集2015/12/02 01:48
tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/12/02 04:35

回答有難うございます。 こんな感じでしょうか? <script> FunctionName(){ location.replace('logout.php'); } </script> <html> <a onclick="FunctionName();">ログアウト</a> </html>
tkanda

2015/12/02 08:34

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

0

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

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

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

投稿2015/12/01 08:32

think49

総合スコア18156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/12/01 09:34

セッションが存在する場合の処理としては、こんな感じでしょうか!? //【kanri.php】 if($_SESSION['time'] == ""){ header('Location: login.php'); } 試したら、管理画面表示前にlogin.phpに戻されてしまいました。 login.phpで冒頭で session_start(); させてますが、 管理画面内でも冒頭で、 session_start(); してまして、セッションが続いているなら管理画面のさらに冒頭で、 上記のセッション存在確認しても問題ないかと思いましたが…
Satochan24

2015/12/01 09:57

回答有難うございます。 明日、確認してまたコメントします。 キャッシュ制御は…目的は、管理画面内をログアウト後に表示させないことなので、 セッションで制御できればそれでも良いかと思っています。
Satochan24

2015/12/02 08:05 編集

こんにちは。試してみました。 そしたら、最初のログインの時点で、セッションがないと判断され、リダイレクトされてしまいました。管理画面にも入れない状態でした。 if(session_status() == 1){ header('Location: login.php'); }
think49

2015/12/02 08:13

ログイン時にセッションを作成するわけですよね? ならば、ログイン前はセッションがなくて当然なのでは…。 ログイン時にパラメータを受け取ったら session_start() でセッションを作成するコードになると思います。 > if(session_status() == 1){ PHPマニュアルによれば返り値は数値ではなく、定数ですね。マニュアルの再読をお勧めします。 if (session_status() !== PHP_SESSION_ACTIVE) { header('Location: login.php'); } http://php.net/manual/ja/function.session-status.php
Satochan24

2015/12/02 08:36

回答有難うございます。1にしたのは、echoで、session_statusの値が数値だったためです。とりあえず、上記のコードで試してみましたが、やはり管理画面が表示される前にログイン画面に戻されました。コードは最初に記載した内容とほぼ同じです。 login.phpなどは、一般的はログイン処理を参考にしています。
think49

2015/12/02 08:44 編集

つまり、こういうことでしょうか。 - login.php から admin.php へのリダイレクト処理は正常動作している - ログイン処理後の admin.php で login.php にリダイレクトされてしまう - session_status() のコードは admin.php のみに書いている
Satochan24

2015/12/02 08:51

その通りです。admin.phpではなく、kanri.phpですが… とりあえず、logout.phpに下記のコード書いたら、遷移される前だと管理画面が見えますが、2秒待って遷移された後だと、もう管理画面の戻れなくなったので、これで(完璧ではないですが、)進めようかなぁ…と思っています。 <script> <!-- // 一定時間経過後に指定ページにジャンプする mnt = 2; // 何秒後に移動するか? url = "login.php"; // 移動するアドレス function jumpPage() { location.href = url; } setTimeout("jumpPage()",mnt*1000) //--> </script>
think49

2015/12/02 09:05 編集

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

2015/12/02 09:11

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

0

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

投稿2015/12/01 06:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/12/01 06:54

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

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>

投稿2015/12/03 08:31

Satochan24

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問