22025


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

[code]

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

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

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

* * *

**質問2**

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

[code]

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

* * *

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

* * *

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

[code]

    session_cache_expire(0);
    session_cache_limiter('private_no_expire');
    session_start();
    
[/code]

ヘッダ

[code]

    Cache-Control: private, max-age=0, pre-check=0
    
[/code]

* * *

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

[code]

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

* * *

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

[code]

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


CC BY-SA 3.0
2016-02-12T13:19:57.313
22012
2016-02-13T03:29:42.257
7886
question
javascript php
history.backが、成功したり失敗したりする理由は？


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

* * *

  * 質問1

ブラウザの挙動によりけりですが恐らく  
１．"#"付きのURLに遷移する(Aタグの遷移が起動)  
２．直前のページに移動(history.back())  
３．"#"が外れた元の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のもので、  
リクエストなどが原因でセッション切れを起こさないようにする設定ですね。

[code]

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

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

* * *

  * 質問5

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

* * *

  * 質問6

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

[code]

    <meta http-equiv="Cache-Control" content="private, max-age=0, pre-check=0">
    
[/code]


CC BY-SA 3.0
2016-02-13T01:50:11.587
22025
2016-02-13T01:50:11.587
22012
answer


質問1ですが、`history.back()`で移動するページを最初に表示した際に、URLを直接入力したり、リンクから移動した場合はメッセージが表示されず、ボタン等から移動した場合は表示されるという動作になっていませんか？  
一般的なWebブラウザは入力フォームから`POST`リクエストで表示された履歴に戻ろうとした場合、確認メッセージを表示します。  
これを回避するには2個前のページの`<form>`のメソッドを`get`に変更するか、別の手段を使って移動する必要があるかと思います。


CC BY-SA 3.0
2016-02-13T03:29:42.257
22026
2016-02-13T03:29:42.257
5750
22012
answer