Основні способи:
return redirect('/dashboard'); // за шляхом
return redirect()->route('posts.show', $post); // за іменем маршруту (модель підставить ключ)
return to_route('posts.show', ['post' => $post]); // коротша форма
return redirect()->action([PostController::class, 'index']);
return back(); // на попередню сторінку
return redirect()->away('https://partner.example.com'); // на зовнішній домен без перевірки URL
Разом з повідомленням - флеш-дані сесії, доступні лише в наступному запиті:
return redirect()->route('posts.index')
->with('status', 'Публікацію збережено.');
@if (session('status'))
<div class="alert">{{ session('status') }}</div>
@endif
Повернути з введеними даними й помилками (якщо перевіряєте вручну, а не через валідацію):
return back()
->withInput()
->withErrors(['email' => 'Цю адресу вже зареєстровано.']);
У формі введене повертається через old('email'), помилки - через @error('email'). Валідація Laravel робить це сама: при помилці вона кидає виняток, що перетворюється саме на такий редирект.
Патерн Post/Redirect/Get: після успішної обробки форми (POST) - завжди редирект, а не відображення сторінки. Інакше оновлення сторінки в браузері повторно відправить форму: другий платіж, дубль коментаря.
Типові помилки:
redirect()безreturn- нічого не відбувається, виконання триває;back()без запасного варіанта: якщо користувач прийшов за прямим посиланням, «назад» може вести на зовнішній сайт чи нікуди.back(fallback: route('home'));- редирект за URL з параметра запиту (
redirect($request->input('next'))) - відкритий редирект, яким користуються фішери. Для повернення після входу -redirect()->intended(...), а сторонні адреси - лише зі списку дозволених; away()для внутрішніх адрес - він не перевіряє URL взагалі; для своїх сторінок -route().
Коди: redirect() за замовчуванням дає 302. Постійне перенесення сторінки (SEO) - 301: redirect('/new', 301) чи Route::permanentRedirect('/old', '/new') у маршрутах.