POST遷移をやり直したときにiOSのsafariが固まる

PHPで制作中に気づいた。

フォームからPOST遷移で次のページに行ったあと、
そこでリロードしたり、もしくはさらに次のページから戻ってきた場合
「フォームの内容の再送信をするか?」と聞かれます。

再送で同じページが出てくるならそれで良いのですが、
場合によっては再送させたくないので、別ページにリダイレクトしたりする場合があります。

今回は「リロード時のみ別ページに転送したい」ということでやってみたんですが
iOSのsafariだと、「再送しますか?」の画面で固まって、それ以上の操作を受け付けませんでした。

form.php

<?php
session_start();
if($_SERVER['REQUEST_METHOD']=='POST'){
  if(isset($_SESSION['token'])){
    // トークンがあれば正常、トークンは削除
    echo 'success';
    session_destroy();
    exit;
  }else{
    // トークンがなければエラーページへリダイレクト
    header('Location: errer.html'); // デフォルトでは302でリダイレクト
    exit;
  }
}else{
  // 通常アクセスの際にトークンを発行
  $_SESSION['token']=1;
}
?>
<html><body>
<form action="" method="POST"><input type="submit" value="post"></form>
</body></html>

ところで、リダイレクトは
301 Moved Permanently
302 Moved Temporarily
の他にも
303 See Other
307 Temporary Redirect
というのがあるんですね。

本来ならPOSTして302リダイレクトが帰ってきたら、
リダイレクト先にもPOSTしないといけない(らしい)。

302の場合は
「POSTしましたけどー」「うちじゃないよ、転送先を当たってくれ」
なので、転送先にもあらためてPOSTすることを想定してる。

303の場合はPOST後にGETで見せたいなど、
「POSTしましたけどー」「処理は完了した、次にこっちを見てくれ」
という場合に使うんですね。

ブラウザのPOSTリクエストは、リダイレクトさせるとGETに化ける? ::ハブろぐ

なので、もしかしたら303でリダイレクトしてやったらsafariも固まらないのか?と思いまして

header("HTTP/1.1 303 See Other");
header('Location: error.html');
exit;

としてみましたが、やっぱりsafariは固まりました。

となると、本来であればPOST後のページをform.phpで出すのではなく、
その時点でリダイレクトするというPRGパターン(POST-Redirect-GET)にしておけば良いんでしょうね。
(戻って固まるのは同じだが、頻度は減る?)

あとはそもそもリダイレクトしないことだな。

頭の悪いパナシ 54 – 損得勘定(感情)でゲームしてる

10分トーク『Nacky × DJ TECHNORCH – 頭の悪いパナシ』の54回目です。

●親切過ぎるゲームと不親切過ぎるゲーム
●ゲーム内で説明せず、紙で取扱説明書がついていた
→当時のゲームにはゲーム内で説明する親切さの余裕はない
●常にボーナスや侘び石を「得」をもらっていると、そうじゃない時にむしろ「損を感じる」
●点数をためるためのクエスト(カードバトル・シューティング等)と、その点数をつかった本戦
→そのクエスト自体がとっても面白くあって欲しい!→ソシャゲ向いてない
●Mixi サンシャイン牧場
●昔のゲームは大体異常に不親切で、その不親切なものを百回もやるとなんとなく面白さがわかる
→そもそもそれだけ不親切なものに努力させるモチベーションはどこから得ていたのか(今なら無理)
●テクノ・ハウス伝説の楽器、Roland TR-909/TB-303の音作りの異様な不親切さ
●不親切なゲームを一度もプレイしていないプレーンな私達に
→不親切なレトロゲームと親切なソシャゲを同時に並べらたら恐らくソシャゲをプレイするだろう
●昔のゲームは不親切なゲームしかないので選ぶための選択肢がない
→ゲームのモチベーションを挙げるための「下駄」履かせがいらなかった
→不親切なゲームを強引に千回ゲームオーバーさせると出て来る楽しさがあり
→今親切・不親切のゲームの選択肢がある中でゲームメーカーが敢えて千回ゲームオーバーさせるのは至難の業
(現在は沢山死んで学ぶゲームも、死ぬことで何が学べるかちゃんとわかるようにある程度親切に作ってある)
●それは車で例えるならば (※反証:でも最新の車って運転席でチュートリアルみたいなことをしてくれる)

自分の努力が楽しい
集めるのが楽しい(バーチャル金持ち)

まぁ「レトロゲームvs現代のソシャゲ」じゃなくても、
昔からそういうものかもしれませんねぇ。

セガのテトリスはデモ画面でのチュートリアルがありましたね。

TR-909のパネル。ぱっと見はこれでどうやって音楽を作れと!?って感じです。

説明書を見ながらポチポチしていくようなものを、ライブパフォーマンスに使う人もいる。

最近でもひたすら不親切(でもないけど)なゲームはありますね。

N++も出てたな。

昔のゲームは不親切がゆえに、楽しみ方がうまく伝わらなかったりして
いわゆるクソゲーとかを生み出していたんじゃないかという気がします。

でも本当の損得は「時間を何に使ったか」に対する感情じゃないかなぁ。

頭の悪いパナシ 53 – セーブ(保存)したいもの

10分トーク『Nacky × DJ TECHNORCH – 頭の悪いパナシ』の53回目です。

●修行ゲームと蓄積ゲームのお話
●ストリートファイターはアカウントデータが消えても腕前として身体に「修行」結果が残るので特に問題がない
●1年半努めた「蓄積」ゲーム=ソシャゲのデータが消えたらやる気が…
●DJ TECHNORCHは多分、修行ゲームしかやったことがない
●音ゲーは修行ゲームだから好きだ。基本的には腕前が残る。
●昔の音ゲーは電源が切れると消える当日(その台だけの)ランキングしかなかった
●大昔のゲームは大抵修行ゲーム
●ドラクエ初のデータ記憶チップ(すぐ消える)
●「修行」の腕前は何故か数年たっても身体に残っている
●DJ TECHNORCHはDQ/FFを全くやってこなかったので(NackyはDQ3まで)
→成人して気がついたらラノベ・異世界系・ソシャゲで「剣と魔法の世界」が基本になっていることに驚き
●同人音楽でもDQ/FF/MOTHERを通過したかしてないかで若干の音楽感の差を感じる(ゲーム経験の物語)
●ファミコン時代、他人のデータを消してしまうことへの恐怖(現代のソシャゲで他人のを消したら訴訟だ!)
●リュウとケンを何万回プレイしてもリュウとケンそれ自体は何も「蓄積」されず、強くならない
●修行ゲームと蓄積ゲームはゲームとして随分違うようだ。
●次回「不親切過ぎるレトロゲームと親切過ぎる現代ゲーム・ソシャゲ」続く

キャラクターアニメーション : ガしガし

いわゆるドラクエ的なRPGって最後にやったのが、たぶんDQ3なんです。
格闘ゲームもずっとバーチャファイターをやってましたけども、
まぁ、「腕前」があれば別にデータ蓄積はいらないんですよね。

スマホゲームも、アイドルマスターの「デレステ」をやってましたが
半年前ぐらいにやめてしまいました。
音ゲー部分は好きだったんですけどね、毎日続けろ的な要素がな…

Ingressは2013年から続いてますけども、
これは毎日やらなくてもいいところが続いてる理由じゃないかなぁ。
同様にポケモンGOもたまーに思い出したように起動してます。

コインを入れて、ファミコンならば電源を入れて、
ゼロからゲームを始めて、しばらくしたらおしまい。
実績などは残らず、経験だけが残る。
そういうビデオゲームが、まぁ、原始的とでも言えるのかな。

短期的に蓄積、保存をしていって目的を達成する。
次のゲームはまたゼロから始める。
みたいなのは、例えばときめきメモリアルとか、
パラメーター蓄積で、セーブして続けていくんだけども
また「育成し直す」ことで別プレイができる。

そう考えると
ドラクエとかFFも、上記よりも長期スパンではあるけれども、
またゼロから始めるようなこともできるゲームでしたね。

これらに比較すると、スマホ時代のソーシャルゲームと言われるものは、
蓄積、コレクションそのものが心の財産になるので
ゼロから始めづらい(始められないわけじゃないが、とうていやる気にならない)
という特徴があるかもしれません。

剣と魔法の世界が当たり前になったの、なんなんでしょうね!
もちろん私もその中で生きてきましたけども。

時代劇が当たり前の世界という年代もいるだろうなぁ。

ゲームが世界観の配布媒体として非常に強力だったということか…