やりたいこと
サービスをスタートしてからパスの構造を整理したりして、コンテンツを引っ越した時に、Laravelにはリダイレクトルートという便利な機能があり、
Route::redirect('/old/path', '/new/path');
や
Route::permanentRedirect('/old/path', '/new/path');
のように記述して301、302のリダイレクトを行うことができます。こうしておけば旧パスでコンテンツをブックマークしている人にも404を返さなくてすみます。便利。
ただ、このredirect
やpermanentRedirect
はクエリパラメータを引き継いでくれないようで、例えば
http://your.domain/old/path?param=hello
のようなURIにアクセスされても
http://your.domain/new/path
にリダイレクトされてしまいます。パラメータを捨てられてしまうと動的なコンテンツはまともに生成できなくなってしまったりするので困ります。なんとか引越し先にパラメータを持っていきたい。
解決方法
以下のようにリダイレクトルートを記述すればクエリパラメータを引き継ぐことができます。
Route::redirect('/old/path', '/new/path?' . Arr::query(request()->query()));
permanentRedirect
でも同じです。単純にヘルパを用いてクエリストリングを新しいパスに追加しているだけです。
この方法でルートキャッシュも問題なく生成されるようでした。このようなサービスイン後のコンテンツのお引越しは多くはないとはいえ無いわけではないので、もしかしたらもっと単純な方法があるのではないか?という気もします。