LoginSignup
8
8

More than 1 year has passed since last update.

【Laravel】ルーティングファイル(web.php)の中でリダイレクト設定する方法(パラメータ付きURLに条件分岐で適用する実例)

Last updated at Posted at 2021-04-10

使わなくなったページをweb.phpの中でリダイレクトする方法について。比較的自由度が高いので、同じ処理でも書き方がいくつか存在する。

302転送と301転送それぞれの指定方法および、

パラメータ付きのURIの転送設定をする場合は、意図しない転送を防ぐために個別にURLを指定することが推奨となる。これを配列とforeachを使って簡潔に記述する方法について。

##目次

  1. リダイレクト先をURIで指定する方法
  2. リダイレクト先をルート名で指定する方法
  3. Route::getとreturnを使う方法
  4. パラメータ付きURIの転送設定(条件の設定)

##1. リダイレクト先をURIで指定する方法

デフォルトの転送設定は302(一時的な転送)。
301(永続的な転送)にしたい場合は記述する必要がある。

web.php(302転送)
Route::redirect('/old-url', '/new-url');

###301転送の設定
web.php(301転送)
Route::redirect('/old-url', '/new-url', 301);

またはpermanentRedirectメソッドを使う。

web.php(301転送)
Route::permanentRedirect('/old-url', '/new-url');

##2. リダイレクト先をルート名で指定する方法
web.php(302転送)
//転送先ルート
Route::get('/user', 'UserController@index')->name('user');

//リダイレクト設定
Route::redirect('/old-url', route('user') );

###301転送の設定
web.php(301転送)
//転送先ルート
Route::get('/user', 'UserController@index')->name('user');

//リダイレクト設定
Route::redirect('/old-url', route('user'), 301 );

またはpermanentRedirectメソッドを使う。

web.php(301転送)
//転送先ルート
Route::get('/user', 'UserController@index')->name('user');

//リダイレクト設定
Route::permanentRedirect('/old-url', route('user') );

##3. Route::getとreturnを使う方法 コントローラ@アクションや、return viewを指定している部分の戻り値にredirectを指定する。
web.php(302転送)
Route::get('/old-url', function(){
  return redirect('/new-url');
});

###ルート名で指定する場合

web.php(302転送)
//転送先ルート
Route::get('/user', 'UserController@index') -> name('user');

//リダイレクト設定
Route::get('/old-url', function(){
  return redirect() -> route('user');
});

または

web.php(302転送)
//リダイレクト設定
Route::get('/old-url', function(){
  return redirect( route('user') );
});

###301転送の設定
web.php(301転送)
Route::get('/old-url', function(){
   return redirect( '/new-url', 301 );
});

####ルート名で指定する場合

web.php(301転送)
//転送先ルート
Route::get('/user', 'UserController@index') -> name('user');

//リダイレクト設定
Route::get('/old-url', function(){
  return redirect( route('user'), 301 );
});

##4. パラメータ付きURLの転送設定(条件の設定) パラメータ付きのURIの転送設定をする場合は、個別にURLを指定することが推奨される。

▼個別に指定する理由

  • リダイレクト対象のURLを明確にする。
  • 意図しないリダイレクトが発生するリスクを防ぐ。

##実例
例えば、以下のようにproduct/{prd_slug}で特定の製品名の詳細ページを/productにリダイレクトする処理は以下のようになる。

web.php(元のルーティング)
Route::get('product/{prd_slug}', 'ProductController@show')
   -> name('product.show');

###リダイレクトの設定 ###1. 正規表現で指定する whereメソッドと正規表現を使って指定する。

->where( 'パラメータ名', '正規表現' )

正規表現の例
Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

###配列から正規表現を作成する方法
対象のslugが複数ある場合は配列から正規表現を作成すると簡単。

web.php
$removed_slugs = [ 'iphone5', 'iphon6',  'iphone6s' ];
$removed_slugs = implode( '|', $removed_slugs );
$regexs['removed_slugs'] = '(' . $removed_slugs . ')';

implode( '繋ぐ文字列', 配列 )
配列を指定した文字列で繋ぎ合わせて、一つの文字列に変換する。

この処理で、[ 'iphone5', 'iphon6', 'iphone6s' ]( 'iphone5' | 'iphon6' | 'iphone6s' )に変換できる。

正規表現で( 'aaa' | 'bbb' )の形は、aaaかbbb
という意味。

これをwhereメソッドの第2引数で指定する。

web.php
$removed_slugs = [ 'iphone5', 'iphon6',  'iphone6s' ];
$removed_slugs = implode( '|', $removed_slugs );
$regexs['removed_slugs'] = '(' . $removed_slugs . ')';

Route::get('product/{product_slug}', function() use ($regexs) {
    return redirect( route('product'), 301 );
    })->where('product_slug', $regexs['removed_slugs']  );
});

function() use ($変数名)
functionの外で定義した変数を使う場合にはuse ($変数名)で宣言する必要がある。

これがないとエラーになる。


###2. foreachで指定する おすすめではないがforeachを使って記述することも可能。 リダイレクト対象となるパラメータの値を配列に入れて、foreachで抜き出し一つ一つリダイレクト設定をかける。
web.php(リダイレクト設定301)
//転送先ルート
Route::get('/product', 'ProductController@index') -> name('product');


//リダイレクト設定
$removedSlugs = [ 'iphone5', 'iphon6',  'iphone6s' ];
   foreach ( $removedSlugs as $removedSlug ){
     Route::get('product/' . $removedSlug, function(){
        return redirect( route('product'), 301 );
     });
};

以下と同じになる。

web.php(リダイレクト設定301)
Route::get('product/iphone5', function(){
  return redirect( route('product'), 301 );
});
Route::get('product/iphone6', function(){
  return redirect( route('product'), 301 );
});
Route::get('product/iphone6s', function(){
  return redirect( route('product'), 301 );
});

対象ページが多い場合は、配列とforeachを使うことで記述をかなり省略できる。


###よくない事例 パラメータ付きルート自体にリダイレクト設定をかけてしまうと、本来リダイレクト対象でないページまで301転送がかかってしまう。
web.php
Route::get('product/{prd_slug}', function(){
  return redirect( route('product'), 301 );
});

##参考リンク


以上。
8
8
0

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
8
8