laravel重定向将多个旧的子弹路由到新的子弹

时间:2019-04-13 11:38:42

标签: php laravel

随着时间的推移,我的博客网址已更改为更准确的网址。

例如:

  1. domain.com/a/1
  2. domain.com/b/2
  3. domain.com/b/3

但是Internet上的某些页面具有旧链接,我想以结构化的方式重定向。

所以我首先做了:

Route::get('/a/{slug}', function($slug){
    return redirect('/b/'.$slug, 301);
});

现在我有很多旧款和新款,我想知道是否有更聪明的方式来做,而不是:

Route::get('/b/1', function(){
    return redirect('/b/3' 301);
});
Route::get('/b/2', function(){
    return redirect('/b/3' 301);
});

我正在寻找和数组类似的东西或其他更好的方法:

  • old-slug => new-slug
  • 1 => 3
  • 2 => 3

  • (old-slug | old-slug)=> new-slug
  • (1 | 2)=> 3

我在laravel包中使用this routes

我发现的最接近的问题is this暗示着以下内容:

Route::pattern('old-slug', '(1|2)');
Route::get('/b/{slug}', function ($old-slug) {
    return redirect('/b/3' 301);
});

问题:

  • 最后的解决方案是要走的路吗?
  • 如果是的话,我已经尝试过并且无法正常工作,那么我可能会在我根据其他提到的帖子编写自己的代码时出现一些错误

2 个答案:

答案 0 :(得分:1)

哪个更好?

两种方法都可以。但是,如果您可以使用pattern覆盖它们,那会更好,因为您不需要额外的数组。否则,数组将更具可读性和特定性,因为从数组中您可以清楚地知道old-sulg被哪个new-slug所代替。此外,如果一个旧的重定向到一个新的Slug,而另一个旧的Slug重定向到另一个新的Slug,则模式在这里不是一个好的选择。另一方面,如果所有旧块仅重定向到一个相同的新块,则如果可能的话,会更好。

如何解决最后一个解决方案?

在此解决方案中,您将使用名称定义模式/表达式。喜欢:

Route::pattern('pattern_name', 'pattern');

现在,无论何时要使用此模式,都可以使用pattern名称。例如:

Route::get('url/{pattern_name}', function(){
  // Codes
});

如果url模式与define模式匹配,则将调用闭包。

因此,要使您的代码正常工作,应按以下方式对其进行重构:

Route::pattern('old_slug', '(1|2)');

Route::get('/b/{old_slug}', function ($oldSlug) {
    return redirect('/b/3' 301);
});

以下是您的模式名称old-slug,模式为1|2表示1 or 2。结果,如果有人调用/b/1/b/2,它将匹配模式并执行return redirect('/b/3' 301);

答案 1 :(得分:0)

这是我最后做的,因为这是最简单,最可维护的方式:

Route::get('/a/{slug}', function($slug) {

    $urls = [
        '1' => 'b/3',
        '2' => 'b/3'
    ];

    if(isset($urls[$slug])){
        $new_url = $urls[$slug];
    }else{
        $new_url = $b.'/'.$slug;
    };
   return redirect('$new_url, 301);
};