はじめに
PHPでリダイレクトをしなくてはいけない時があったのですが、その際に少しはまってしまったのでその話を書きたいと思います。
メソッドとパラメータを変えずにそのまま次の画面に渡す、ということをしようとしていました。
勘違いしていたこと
PHPにはheader関数があり、それを使用して
header("Location: {リダイレクト先のURL}", true, 307);
というような感じで実装していました。
307リダイレクトは、
メソッドと本文は変更しません。
(https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections より引用)
というように記載してあったのでてっきりPOSTでもGETでもきたパラメータはすべて渡してくれるのかと思っていました。
実際に挙動を見てみる
index.html
⇓ GET POST
index1.php
⇓ 307リダイレクト
index2.php
というような感じでリダイレクトさせ、index2.php
でGETとPOSTの値を見てみることにします。
各ファイルは以下のようにしました。
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
<body>
<form method="POST" action="./index1.php">
<input type="text" name="name" />
<button type="submit">POST送信</button>
</form>
<form method="GET" action="./index1.php">
<input type="text" name="name" />
<button type="submit">GET送信</button>
</form>
</body>
</html>
header("Location: ./index2.php", true, 307);
echo("POSTの値:");
echo($_POST["name"] ?? "POSTなし");
echo("<br>GETの値:");
echo($_GET["name"] ?? "GETなし");
1画面目は画面で見るとこんな具合です。
POST
まず、POSTで送信してみます。
POST送信ボタンのとなりにデータをいれ、POST送信ボタンを押してみます。
index2.phpではPOSTの値がうまく取れていました。
GET
次にGETで送信してみます。
先ほどと同じようにGET送信ボタンの横にテストと文字を入力してGET送信ボタンを押してみます。
すると、GETの値が取れていませんでした。
結論
どうやら、GETの時はパラメータを渡してくれないようです。
もしGETのときもPOST同様に値をリダイレクト先に渡したいときは以下のようにリダイレクト処理を変更すると渡すことができました。
header("Location: ./index2.php?".$_SERVER['QUERY_STRING'], true, 307);
$_SERVER['QUERY_STRING']は、
ページがアクセスされた際にもし検索引数があればそれが格納されます。
(https://www.php.net/manual/ja/reserved.variables.server.php より引用)
というものです。
つまり、GETパラメータがもしURLについていたら、そのGETパラメータをそのままStringとして取得できるよというものでした。
これをリダイレクト処理に書くことで、GET・POST問わず、リダイレクトをするときにメソッドそのままでパラメータをリダイレクト先に送れるようになりました。
おわりに
結局なぜPOSTの時は値をリダイレクト先に渡せて、GETの時には渡せないのかがよくわかりませんでした。
もし詳しい方いたらコメントで教えていただけると助かります。
また、もっといいやり方や間違っている点などありましたらご指摘いただけると幸いです。
最後まで読んでいただきありがとうございました。
参考