随着时间的推移,我的博客urls已经变成了更精确的urls。
例如:
但是有些网页有旧的链接,我想用一种结构化的方式重定向。
所以首先我做了:
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包
我发现是这个吗提出的最接近的问题是:
Route::pattern('old-slug', '(1|2)');
Route::get('/b/{slug}', function ($old-slug) {
return redirect('/b/3' 301);
});问题:
发布于 2019-04-13 12:00:31
哪一个更好?
两条路都可以。但是,如果您可以使用模式来覆盖它们,那么它会更好,因为您不需要额外的数组。否则,数组更具可读性和具体性,因为从数组中可以清楚地知道old-sulg被哪个new-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);
发布于 2019-04-13 21:44:33
这是我最后所做的,因为它是最简单和最易于维护的方式:
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);
};https://stackoverflow.com/questions/55665021
复制相似问题