2
1

【PHP】307リダイレクトをよく理解してなかった話

Posted at

はじめに

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の値を見てみることにします。

各ファイルは以下のようにしました。

index.html
<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>
index1.php
header("Location: ./index2.php", true, 307);
index2.php
echo("POSTの値:");
echo($_POST["name"] ?? "POSTなし");

echo("<br>GETの値:");
echo($_GET["name"] ?? "GETなし");

1画面目は画面で見るとこんな具合です。

image.png

POST

まず、POSTで送信してみます。
POST送信ボタンのとなりにデータをいれ、POST送信ボタンを押してみます。

image.png

index2.phpではPOSTの値がうまく取れていました。

image.png

GET

次にGETで送信してみます。
先ほどと同じようにGET送信ボタンの横にテストと文字を入力してGET送信ボタンを押してみます。

image.png

すると、GETの値が取れていませんでした。

image.png

結論

どうやら、GETの時はパラメータを渡してくれないようです。

もしGETのときもPOST同様に値をリダイレクト先に渡したいときは以下のようにリダイレクト処理を変更すると渡すことができました。

index1.php
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の時には渡せないのかがよくわかりませんでした。

もし詳しい方いたらコメントで教えていただけると助かります。

また、もっといいやり方や間違っている点などありましたらご指摘いただけると幸いです。

最後まで読んでいただきありがとうございました。

参考

2
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1