目的
クエリパラメーターを保持した状態でのリダイレクト。
旧ファイルを別のディレクトリに移動したときに旧ファイルに対してアクセスしたときを想定。
$_SERVER['QUERY_STRING']
https://example.com/aaa.html?param1=AAA¶m2=BBB¶m1=CCC
Laravel配下にaaa.htmlを移植した場合、旧ファイルに対してリダイレクト処理を記述する場合に以下のようにリダイレクト処理を書いていた。
<?php
$redirectUrl = "aaa";
header("Location: $redirectUrl");
exit;
しかしこれだとクエリパラメーターを保持したURLがアクセスされた場合引き継げない。
なのでいかのように$_SERVER['QUERY_STRING']を使う。
<?php
$redirectUrl = "aaa";
if (!empty($_SERVER['QUERY_STRING'])) $redirectUrl .= "?" . $_SERVER['QUERY_STRING'];
header("Location: $redirectUrl");
exit;
$_SERVER['QUERY_STRING']にはリクエストしたURLの ?以降の部分(クエリパラメータ)が格納されている。
旧URLに対して検索条件が付与されたリクエストされても、検索条件を維持したままリダイレクトがされる。
地味につまづいたポイント(変数展開)
"Location:" ヘッダで変数を使ってURLを設定するときにシングルクォーテーション(' ')で囲むと変数展開されなかった。
"Location:" ヘッダに限った話ではないが、ダブルクォーテーション(" ")で囲むことで変数展開させる。
定義した変数が正しく展開される。
header("Location: $redirectUrl");
$redirectUrlが文字列として扱われる。直でURLをいれるならどちらでもいいが変数は使えない。
header('Location: $redirectUrl');
ダブルクォーテーションとシングルクォーテーションの違い
項目 | ダブルクォーテーション(") | シングルクォーテーション(') |
---|---|---|
文字列展開 | 変数やエスケープシーケンスが展開される | 展開されず、そのままの文字列として扱われる |
特殊文字のエスケープ | エスケープシーケンス(例:\" 、\\ )が使用可能 |
エスケープシーケンスは無効で、バックスラッシュもそのままの文字として扱われる |
記号の扱い | 一部の記号が特殊な意味を持ち、エスケープシーケンスとして解釈される | 記号はそのままの文字として扱われる |
参考サイト
PHPマニュアル($_SERVER)
PHPマニュアル(header)
感想
あまりダブルクォーテーションとシングルクォーテーションの違いを意識していなかったが、小さいところをないがしろにすると足元をすくわれてしまった。