Убрать дубли URL в Laravel

12
D
На сайте с 28.06.2008
Offline
1104
541

У меня есть контроллер, который показывает одну новость

Route::get('/news/{id}-{alias}', [App\Http\Controllers\NewsController::class, 'getOne'])->where(['id' => '[0-9]+', 'alias' => '(.*)']);

Но статья будет доступна по адресам

/news/688-virus
/news/688-viru
/news/688-lyubaya_chush и т.д.

Как сделать чтобы все эти варианты приводили к переадресации на единственно верный?

Т.е. если после /news/ есть ID и такой ID реально есть в базе, была переадресация на /news/id-реальный_алиас_данного_ID

L
На сайте с 10.02.2015
Offline
235
#1

Универсальное решение:

Проверить чушь с адресом, который формируется для ссылок по сайту, и сделать 301 редирект.

D
На сайте с 28.06.2008
Offline
1104
#2
Я только учу лару - где эта проверка должна быть в контроллере или роуте?  Можно пример? Это же запрос в базу делать надо?
LEOnidUKG
На сайте с 25.11.2006
Offline
1751
#3
Т.е. если после /news/ есть ID и такой ID реально есть в базе, была переадресация на /news/id-реальный_алиас_данного_ID
Это и есть ответ на твой вопрос. Что ещё то надо?
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
LEOnidUKG
На сайте с 25.11.2006
Offline
1751
#4
Dram #:
в контроллере 

Тут ибо в нём идут логические цепочки. Роутер только перекидывает.

D
На сайте с 28.06.2008
Offline
1104
#5
LEOnidUKG #:
Это и есть ответ на твой вопрос. Что ещё то надо?

Я не могу сообразить как правильно это сделать в ларе.

Вот моя функция в контроллере

    public function getOne($id, $alias)
    {
        $this->news_one = DB::table('news_items')
            ->where('id', '=', $id)
            ->where('alias', '=', $alias)
            ->get();
        return view('news_one', ['news_one' => $this->news_one]);
    }

Вероятно ее нужно менять по типу - если есть совпадение в базе по ID но алиасы не совпадают, то редирект и вот тут я не знаю как это правильно попробовать согласно синтаксису лары

D
На сайте с 28.06.2008
Offline
1104
#6

Офигеть САМ!!! сделал!! Я в шоке с себя !!

    public function getOne($id, $alias)
    {
        $this->news_one = DB::table('news_items')
            ->where('id', '=', $id)
            ->get();
        if($this->news_one[0]->alias !== $alias){
            return redirect('news/'.$id.'-'.$this->news_one[0]->alias, 301);
        }
        return view('news_one', ['news_one' => $this->news_one]);
    }
Odinochka
На сайте с 11.11.2011
Offline
113
#7
Dram #:

Офигеть САМ!!! сделал!! Я в шоке с себя !!

Молодец, что поделились, обычно пишут что все решено))

D
На сайте с 28.06.2008
Offline
1104
#8

А если роутер изменить так

Route::get('/news/{id}-{alias?}', [App\Http\Controllers\NewsController::class, 'getOne'])->where(['id' => '[0-9]+', 'alias' => '(\w+|-){1,40}']);

т.е. добавить ? после alias сделав параметр необязательным, а функцию так

    public function getOne($id, $alias = null)

Задать дефолтное значение для алиаса, то редиректить на правильный урл будет уже начиная с верного id

E
На сайте с 01.10.2017
Offline
105
#9
Dram #:
редиректить на правильный урл будет уже начиная с верного id

С id и дефиса.

И в QB нужно самому реализовывать логику findOrFail 😉

Кстати, просто find в нем есть 😉

Домены на продажу: https://p20.ru/collection/domains-for-sale
D
На сайте с 28.06.2008
Offline
1104
#10
estic #:

С id и дефиса.

нет, именно чисто с id. 

id + дефис будет давать 404 ошибку

И еще нужно добавить проверку на отсутствие ID в базе с редиректом на стандартную 404 страницу

        if(empty($this->news_one[0]->id)){
            return abort(404);
        }
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий