PHPのheaderリダイレクト時にデータの値をPOSTしたい場合のやり方

2021年8月23日

PHP テクノロジー

eyecatch 夏に食べたスイカの種を、卵パックのゴミに入れていたら、目が出てきてビックリした、ユゲタです。 そんな話はさておき、PHP、POSTと検索すると、file_get_contentsか、curlのどちらかの方法しか引っかからなかったので、 なんとか、自分で力技にて対応した備忘録を残しておきます。

やりたいことをまとめる

まず、何がやりたいのかをハッキリさせておきます。 とあるシステムを作っていて、アカウント登録をする画面を作ったんですが、 特にセキュリティなどを重要視する必要がないので、メール送信してとか、何かしらの面倒くさい手続きを踏まなくて良くて、 アカウント登録を行った直後に、ログインページに移動する仕様にしてみたんですが、 この際に、せっかくログインIDとパスワードを入力してくれていたので、その遷移の場合のみ、ログイン画面では、 ID欄とパスワード欄に、値を挿入してあげたいと思いました。 そして、アカウント情報をPOSTして、その後すぐにログイン画面に遷移する場合、登録情報をPOSTして、ログイン画面に受け渡したいと考えたわけです。 でも、PHPでのPOST送信は、file_get_contentsか、curlでpostした値の返り値を受け取る方式のニーズが高いらしく、 headerでpost送信をするような方法はどこにも書かれていませんでした。 もちろんherderリダイレクトの方法は、任意のURLにアドレスを切り替える方式なので、GETクエリしか保持させることができないという仕様なんですね。 ここに、リクエストヘッダを埋め込めないかどうかいろいろやってみましたが、結果的にダメでした。

実現可能方法

さて、とりあえず、この場合にどういった方法で、このページ遷移で値を送りつけることが可能になるのかどうかを考えてみました。 受け取り側のログイン画面では、値を受け取った際に、ID欄とパスワード欄に値を埋め込むという処理はバッチリできている状態なので、 値を送ることが成功したら、そのまま完了になります。 ちなみに、アカウント登録画面も、ログイン画面も、同じサーバー内でのPHP表示しているページであるという条件を、事前に共有しておきます。 まず思いついたのが、単純に、loginページにfile_get_contentsでpost送信して、返ってきたHTMLタグをそのままechoするという事を考えてやってみましたが、 同じサーバー内なので、httpアクセスでのやり取りがもたつくのか、レスポンスが極めて悪い状態になったので、この方法は却下にしました。 そもそも、めちゃくちゃ効率悪い構造になりますからね。 トラブル時に原因究明がしんどくなりそうです。 次に思いついたのが、SESSIONに値を埋め込む方式です、 POSTにこだわらずに、同じサーバーなのだから、値を一時的に保持しておけばいいだけなんですね。 でも、ログインをしていないのに、SESSIONを発動させるのも、仕様的に気持ちが悪い・・・ 最終的にどうしようもなければ、この方式を試してみるが、他の方法も検討してみる。 そして、最後に思いついたのが、header遷移する際に、cookieに値を一時保存して、遷移後受け取ったら、そのcookieはすぐに削除するという方式を考えてみました。 とりあえずやってみたら、なにげにこれがいい感じに遷移できて、cookieもほぼ人の目で見えないレベルで追加→削除されるので、セキュリティ的にも問題ないのではないかと 簡易に考えてこの方式を採用することにしました。

ソースコード

その際の、部分的なソースコードを書き込んでみます。 送信側のアカウント登録完了後の処理 $data = array( "login_name" => $_POST["login_name"], "login_pass" => $_POST["login_pass"] ); $json = json_encode($data , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); setcookie("cookie_data", $json , time() + 3600 , '/'); header("Location: login.php"); 受信側のログイン画面 if($_COOKIE['cookie_data']){ $cookie = json_decode($_COOKIE['cookie_data'] , true); if(isset($cookie["login_name"])){ $_POST["login_name"] = $cookie["login_name"]; } if(isset($cookie["login_pass"])){ $_POST["login_pass"] = $cookie["login_pass"]; } setcookie("cookie_data", '' , time() -1800 , '/'); }

解説

まず、cookie名「cookie_data」に対して処理をすることを前提とします。 送信側では、$dataに連想配列状態で値を埋め込んで、json形式の文字列に変換して、cookieにそのjson値を保存しています。 受信側では、cookieに、cookie_dataというkeyが存在していれば、その値を取得して、jsonデコードして、その値をID、パスワードにそれぞれ対応できるように、POSTの値に埋め込んでいます。 実際はPOST送信しているわけではないんですが、擬似的にPOSTしているようにも感じられますね。 普段あまりcookieは使わないようにしているんですが、レガシーなこの環境も使えるものは使わないと損でしょ。 でも、cookieを使用負荷にブラウザ設定している場合は使えないんですが、その場合は、ログインすらできないので、オールオッケーということにしましょう。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。