Laravel перенаправить маршрут нескольких старых слагов на новые - PullRequest
0 голосов
/ 13 апреля 2019

URL моего блога с течением времени изменились на более точные.

Например:

  1. domain.com / а / 1
  2. domain.com / б / 2
  3. domain.com / б / 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);
});

Я ищу что-то вроде и массив или какой-то другой лучший способ, как:

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

Или

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

Я использую пакет laravel с по этим маршрутам

Ближайший вопрос, который я нашел это , предлагая что-то вроде:

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

Вопросы:

  • Последнее решение - путь?
  • Если это так, я уже пробовал и не работает, возможно, у меня возникла какая-то ошибка, поскольку я делал код самостоятельно, основываясь на другом упомянутом посте

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Какой из них лучше?

Оба пути в порядке. Но если вы можете покрыть их с помощью шаблона, это будет лучше, потому что вам не нужен дополнительный массив. В противном случае массив более читабелен и специфичен, потому что из массива вы можете получить четкое представление о том, что old-sulg заменяется на new-slug. Кроме того, если и одно старое перенаправление на один новый sulg, и другое старое перенаправление на другой новый slug, тогда pattern не будет хорошим выбором здесь. С другой стороны, если все старые слагы перенаправят только на один и тот же новый слаг, то лучше будет по возможности скороговорка.

Как исправить последнее решение?

В этом решении вы определяете шаблон / выражение с именем. Как:

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

0 голосов
/ 14 апреля 2019

Это то, что я наконец-то сделал, так как это был самый простой и понятный способ:

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);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...