随着时间的推移,我的博客网址已更改为更准确的网址。
例如:
但是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);
});
我正在寻找和数组类似的东西或其他更好的方法:
或
我在laravel包中使用this routes
我发现的最接近的问题is this暗示着以下内容:
Route::pattern('old-slug', '(1|2)');
Route::get('/b/{slug}', function ($old-slug) {
return redirect('/b/3' 301);
});
问题:
答案 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);
};