postでリダイレクト
時々だがこういうお話を聞くことがある(PHP-MLネタ)。
(1) ブラウザからプログラムAにリクエストを出して、Aでしかるべき処理をし、
(2) その後ブラウザからプログラムBへ、プログラムAで処理した内容を持ってpostしたい。
これは「できない」のだ。こんなことができてしまったら大変だ。悪意あるサーバに対して誤ってリクエストを送っただけで、例えば「別のブログサイトへスパム投稿させる」といったこともできてしまう。
上記のような処理を思いついたなら、即座にその考えを捨て、別の処理方法を探るべきだ。
別解として、いくつかあると思う。ぱっと思いついただけでも、
(1) Aで処理した内容をセッションに保存してBへリダイレクトさせ、そして処理。
(2) Aで処理して、必要であればBをインクルードして追加処理をし、結果を表示。
こんなことでできるはず。
しかし最近面白い記事を見かけた。いったんAにpostした内容を、Bへpostで再送信させる方法だ。「Do you PHP」の下岡さんのブログでの記述。
HTTPレスポンスで「一時的にこっちのURLをつかってね」返す方法だ。やり方はheader関数を使って、
header(‘Location: http://www.example.com/B.php’, true, 307);
とステータス307を返してやるというもの。なんでもFireFoxではダイアログが表示されるが、IEでは何も表示されず(何事もなかったように)うまくpostしてくれるそうだ。いろいろなステータスコードがあるものだ。
しかしやっぱりスマートな処理方法ではないと思う。
ロジックを見直すほうがきっとスマートなプログラムになるはず・・・。