PHPでWEBサイトを作るとき、ときどき困ったことになるものに「戻るリンク」がある。「そんなこと?」といわないでほしい。じっさい困るのです。
これがけっこう簡単なことと思われているようで、場合によっては、難しくならないように気を使って仕様を「戻る」にしてくれたりすることもある。
しかしですね、まともに戻れるようにするのは大変なのです。
戻り先が1つ固定されているならいい。しかし、戻り先が複数ある場合は大変困るのだ。
……いや、わたしが簡単なやりかたを知らないだけ?
あ、ところで、勘違いしていただいては困るのだけど、
javascript:history.back()
なんて話ではないのです。これではほんとに一つ前に戻るだけなわけで、じっさいのサイトで使うのはちょっと苦しい。
戻り先の可能性が複数ある場合、基本的には、その画面を表示するときに、「戻り先情報」をパラメータに渡す必要がある。
分岐してさらに分岐して……となってくると、その階層の数だけ戻り先の情報を引き渡し続けなければならない。
そうなるとさすがに面倒なので、セッションを使うかという話になる。PHPにはサーバオブジェクトがないから、画面をまたがって情報を保持する方法はセッションか、DBかなにか使って自力で仕組みを作るしかない。
とりあえず考えつくのは、戻り先になる可能性のある画面を表示するときに、セッション上に置いたスタック(配列かなにか)にこの画面を積んでおく方法だ。
次の画面に表示する「戻る」リンクの遷移先には、このスタックの一番上からとった画面を指定すればいい。
さてしかし、セッションに戻り先のスタックを持たせたとして、やりかたによってだが、今度は別の問題が起こることがある。おなじみブラウザバック(ブラウザの「戻る」)だ。
ブラウザバックでは、ほうっておくとサーバにリクエストが飛ばない。クライアントマシンの中に保存されているキャッシュを表示してしまう。だから、セッションの情報はなんら変化しないまま画面だけが遷移してしまう。
これを回避するためには、ブラウザのキャッシュコントロールを無効化しなければならない。これはHTMLのメタタグか、HTTPヘッダかなにかでやる。
……動的サイトならはじめから常にそうしておきゃいいんだけど、世の中そう都合よくはいかないし。
これでなんとかなったはず……なんだけど、じつはこれでも完全ではないらしく。ブラウザによっては、キャッシュコントロールを無効にしてもリクエストしてこないケースがあるらしい。
同じURLでパラメータだけ違うとき?とか?らしいんだけどよくわからない。
まあくわしい部分はともかくとしても、このあたりはブラウザによって実装が違う可能性がいくらでもあるわけだから、キャッシュコントロール制御に頼ってしまうのは気持ち悪い。
というわけで、ほんとに確実にやるためには、すべてのリンクや画面遷移に遷移もとの情報を持たせるしかない。
全部のリンクのURLになにかパラメータを持たせるか、それとも画面遷移は必ずポストバック(一度同じ画面にリクエストを投げてからリダイレクト)を経由させるか……。
しかも、そうしたとしても、セッションを適切に破棄するためには、サイト内の他の画面全部に処理を組みこまなければならないわけで。
もともとそれなりの設計で作られているなら問題ないけど、世の中(ry
見た目の簡単さから比べると影響が大きいんである。
じつはWEBサイトって特殊な環境なので、こういう感じの問題がけっこうある。簡単そうに見えて、じっさいWEBサイトじゃなければ簡単な話なんだけど、やろうとすると「どうやるんだこれ」となったりする。
それでみんなどうしてるのかなと思って見てみると、たいていはなにも考えてなかったり(笑)
たぶん本当に必要なのは、技術者が
「この『戻る』は本当に必要か?」
といってしまうことなんじゃないかとも思うけど。わざわざ戻るリンクを押すユーザは少ないと思うし。