ツー

日常の記録

POSTの本文をそのままにして別ページにredirectする

307 Temporary Redirect でそういうことができるらしい。

なおSPAじゃなく普通のMVCな構成の時の話。

方法

リダイレクトする側はPHPではこんな感じ。汎用性を考えてこんな感じで。

function redirect($url, int $statusCode = null)
{
    header("Location: {$url}", true, $statusCode);
}

こんな感じで使う。

redirect("/moge", 307);

注意点

マジで本文そのままリダイレクトされるので、パラメータ値でフレームワークの制御をしている場合は注意。無限リダイレクトが発生する。現代のRESTフレームワークであれば問題ないと思うが、お手製のミニフレームワークとか社内フレームワークとかでは ?mode=3 みたいなことをやっている場合があり、その際はフォームの値に <input type='hidden' type='mode' value='3'> みたいなのを含まないようにする必要がある。

CSRFトークンの発行タイミングに注意。今回のPOST内容を維持したかったのはXSRFトークンを取り回したかったからだったけど(REDIRECTしたいけれどGETでXSRFトークンを持ちまわしちゃダメなのでなんとかPOSTにしたい)、controllerの頭でトークン発行をしているとcheck時にもtokenが発行されてしまい前のtokenが無効になるので正常動作しないことになる。ページを表示する寸前に発行するなど気を付けないといけない。

まとめ

そもそもtoken発行を主導でやるみたいなアナログなことを捨てたくはあるけれど、まぁそれはそれ。