history.backが、成功したり失敗したりする理由は?

投稿者: Anonymous

質問1
下記で、成功する時と失敗する時があるのですが、理由として何が挙げられるでしょうか?
・挙動不審です

<a href="#" onclick="history.back()">戻る</a>

このウェブページを正しく表示するには、先ほど入力したデータが必要です。データは再送信できますが、このページで先ほど行った操作を繰り返すことになります

・たまに成功するときがあります(要件不明)
・確認ブラウザはChrome
・シークレットモードかどうかは関係あるでしょうか?


質問2

・下記で2つ前のページに戻れたのですが、2つ前のページへ戻った後(その瞬間すぐに)、1つ前のページへ戻ったりできないでしょうか?

<a href="#" onclick="history.go(-2)">2つ前へ戻る</a>

質問3
・デバッグはどうやるのでしょうか?
・history.back()は、ブラウザのどこからデータを取得するのでしょうか? Cookie?
・jsで、history履歴を配列取得したりできないでしょうか?


質問4
・下記をコピペしたらうまくいった(ような気がする)のですが、どういう意味でしょうか?

session_cache_expire(0);
session_cache_limiter('private_no_expire');
session_start();

ヘッダ

Cache-Control: private, max-age=0, pre-check=0

質問5
・PHPでヘッダーに追記する場合、例えば下記は、<!DOCTYPE html>より前に書くのでしょうか?
・それとも、metaタグの位置に書くのでしょうか?

<?php header("Cache-Control: private, max-age=0, pre-check=0"); ?>

質問6
ヘッダをmetaタグとして記入する場合、下記で合っているでしょうか?

<meta http-equiv="cache-control" content="private" max-age="0" pre-check="0">

解決

恐らく質問1が動作しないので質問がどんどんズレて行っているのかと思いますが
とりあえず回答します。


  • 質問1

ブラウザの挙動によりけりですが恐らく
1.”#”付きのURLに遷移する(Aタグの遷移が起動)
2.直前のページに移動(history.back())
3.”#”が外れた元のURLに戻る

Aタグに書くのであれば下記の何れかです。
<a href"javascript:history.back();">戻る</a>
<a href"javascript:void(0);" onclick="history.back()">戻る</a>

他、”history”系の命令が失敗する可能性として
history.lengthが1(履歴が無い)
・直前のページでPHPなどを使用し、リダイレクトを行っている
・”location.replace”などで現在のページを上書きし遷移してきている
・遷移を行うためのタグがStyle等が原因で押せていない


  • 質問2

意図が分かりません。URLを変更したいだけですか?
ブラウザにURLの変更を通知するだけならHTML5のHistoryAPIを使用すれば可能かもしれません。
(遷移が複雑になるので質問のようなことをやったことがないです)


  • 質問3

何に対してデバッグを行うのでしょうか?
ページ単体ですか?サイト全体ですか?
どういう視点でデバッグしたいのか分かりません。
単に”history.back”などが動作することを確認したいのであれば
Chromeのデベロッパツールなどを利用してコンソールから実行すれば良いかと思います。
履歴まで確認したいのであれば、ブラウザの履歴をクリアした後に実際に遷移して確認するなどしたら良いです。
他、ページ遷移という都合上、ページを離れる前に離れるかどうかイベントを入れることで遷移を行おうとしているチェックもできるかと思います。
window.onbeforeunloadなどで……)

また、履歴の取得ですが、下記の情報しか取得できません。
・直前のリファラ(ユーザの許可が必要)
・履歴の長さ
自身のサイト内に限るのであれば遷移情報を別途、自身で保存しておくなどで対応できるかと思います。


  • 質問4

この命令はPHPのもので、
リクエストなどが原因でセッション切れを起こさないようにする設定ですね。

//キャッシュの有効期限を0にする(即時破棄)
session_cache_expire(0);
//キャッシュ制御用のHTTPヘッダを設定する
//プロキシサーバのキャッシュを禁止してクライアントのキャッシュのみ認める
session_cache_limiter('private_no_expire');
//上記の設定を用いてSESSIONを開始する
session_start();

ヘッダについては
private:複数のユーザが共有されるキャッシュに記録されるべきではない情報。
一人のユーザだけが利用する情報だということ
max-age=0:キャッシュの有効期間に0を設定することでキャッシュを読み取った瞬間、有効期限切れにする
pre-check=0:IEのみの設定。IEのキャッシュ制御機能を無効にしている。


  • 質問5

PHPのheader命令の前には何も出力してはいけません
ですのでHTML上に出力されるドキュメントタイプの宣言も出力のひとつですので
全ての出力の前にheaderは書くべきです。
もちろんですが、PHP内でも他の出力より前にheaderを使用しなくてはいけません


  • 質問6

下記のように書きます。
http-equivはヘッダ名称、contentにその内容を記述します。

<meta http-equiv="Cache-Control" content="private, max-age=0, pre-check=0">
回答者: user10259

Leave a Reply

Your email address will not be published. Required fields are marked *