【问题标题】:laravel redirect route multiple old slugs to the new oneslaravel 重定向路由多个旧的 slug 到新的
【发布时间】:2019-09-04 00:13:35
【问题描述】:

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

例如:

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

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

所以我首先做了:

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);
});

我正在寻找类似数组或其他更好的方式,例如:

  • 老蛞蝓 => 新蛞蝓
  • 1 => 3
  • 2 => 3

或者

  • (老弹头|老弹头) => 新弹头
  • (1|2) => 3

我使用带有 this routes 的 laravel 包

我发现的最接近的问题 is this 建议类似:

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

问题:

  • 最后的解决方案是否可行?
  • 如果是这样,我已经尝试过但无法正常工作,我可能会出现一些错误,因为我根据其他提到的帖子自己编写了代码

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    哪个更好?

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

    如何解决最后的解决方案?

    在此解决方案中,您正在定义一个带有名称的模式/表达式。喜欢:

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

    现在,当您想使用此模式时,只需使用 pattern 名称即可。例如:

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

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

    所以,为了让你的代码工作,你应该重构它如下:

    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);

    【讨论】:

    • 谢谢 Imran,这是最好的方法吗?因为我有很多 url,我有类似的东西会很方便.. 等价数组 (old-slug|old-slug) => new-slug 或类似模式 old_slug => 重定向 new_slug,写作我开始考虑换个地方
    • 答案已更新。请看第一部分。
    【解决方案2】:

    这就是我最终所做的,因为它是最简单且最易于维护的方式:

    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);
    };
    

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 2011-05-12
      • 1970-01-01
      • 2017-06-19
      • 2021-04-26
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多