Редиректы в Laravel: пошаговый разбор для новичка
После формы регистрации пользователя нужно вернуть на нужную страницу с сообщением. Разбираем, как делать редиректы в Laravel 11 — от простого redirect() до возврата на предыдущий URL с ошибками валидации.

К концу этой инструкции вы научитесь перенаправлять пользователя после отправки формы, возвращать его на предыдущую страницу с сообщением об ошибке, редиректить на именованный маршрут и передавать флеш-данные, которые покажутся один раз и исчезнут. Всё на Laravel 11 (актуальная ветка на момент написания), с рабочими фрагментами, которые можно скопировать в контроллер и проверить. Займёт минут двадцать, если проект уже развёрнут.
Что нужно иметь до начала
- Развёрнутый проект на Laravel 11.x (проверьте командой
php artisan --version). - PHP 8.2 или выше — это минимум для Laravel 11.
- Запущенный локальный сервер:
php artisan serveили Valet/Sail. - Хотя бы один контроллер и маршрут, куда вы будете возвращать пользователя. Дальше в примерах используется контроллер
ProfileController, но подойдёт любой.
Все примеры кладутся в методы контроллера. Если у вас логика прямо в маршруте через замыкание — синтаксис редиректа тот же, отличается только обёртка.
Шаг 1. Простейший редирект на URL
Самый частый случай: пользователь отправил форму, вы его перенаправляете на другую страницу. Хелпер redirect() возвращает объект ответа, который нужно вернуть из метода через return.
// app/Http/Controllers/ProfileController.php
public function store(Request $request)
{
// ...сохранение данных...
// перенаправляем на страницу /dashboard
return redirect('/dashboard');
}
Проверка: отправьте форму и посмотрите на адресную строку — она должна смениться на /dashboard, а в панели разработчика браузера запрос отдаст код 302 Found. Это временный редирект, поведение по умолчанию.
Шаг 2. Редирект на именованный маршрут
Жёстко прописывать /dashboard в коде — плохая привычка: поменяете URL в маршрутах, и все редиректы придётся искать вручную. Лучше ссылаться на имя маршрута.
// routes/web.php
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
// в контроллере
return redirect()->route('dashboard');
Если маршрут принимает параметры, передайте их вторым аргументом:
// маршрут: /users/{id}
return redirect()->route('users.show', ['id' => $user->id]);
Проверка: адресная строка покажет собранный URL с подставленным id. Если параметр не передать, Laravel бросит UrlGenerationException с текстом о недостающем параметре маршрута.
Шаг 3. Возврат на предыдущую страницу
Классика для форм с ошибками валидации: пользователь ошибся, вы возвращаете его туда, откуда он пришёл, вместо того чтобы вести на отдельную страницу. За это отвечает back().
return back();
Laravel берёт адрес из скрытого поля _previous.url в сессии, которое middleware проставляет автоматически. Поэтому back() работает только там, где активна сессия — в группе маршрутов web, а не api.
Сохранить введённые данные при возврате
Чтобы пользователь не перезаполнял форму заново, добавьте withInput() — введённые значения улетят во флеш-сессию и будут доступны через хелпер old() в шаблоне.
return back()->withInput();
Проверка: в поле формы после возврата подставьте value="{{ old('email') }}" — оно должно показать то, что пользователь ввёл до отправки.
Шаг 4. Флеш-сообщения: показать один раз
После успешного действия принято показывать зелёную плашку «Профиль обновлён». Такое сообщение должно жить ровно один запрос — метод with() кладёт его во флеш-сессию.
return redirect()->route('dashboard')
->with('status', 'Профиль обновлён');
В шаблоне Blade достаёте его из сессии:
@if (session('status'))
<div class="alert">{{ session('status') }}</div>
@endif
Проверка: сообщение появится один раз после редиректа. Обновите страницу (F5) — оно исчезнет, потому что флеш-данные живут только до следующего запроса.
Разница междуwith()иwithInput()в том, что первый вы читаете черезsession(), а второй — черезold(). Путать их — самая частая причина, почему «данные не подставляются».
Шаг 5. Ошибки валидации и withErrors
Если валидацию делаете вручную (не через Form Request), ошибки прикрепляются к редиректу отдельным методом:
use Illuminate\Support\Facades\Validator;
public function update(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|max:255',
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
// ...сохранение...
return redirect()->route('dashboard')->with('status', 'Сохранено');
}
В шаблоне ошибки доступны через переменную $errors, которую Laravel добавляет автоматически на всех web-страницах:
@error('name')
<span class="error">{{ $message }}</span>
@enderror
Если вы используете Form Request (класс, наследник FormRequest), редирект с ошибками и withInput() происходит сам — вручную withErrors() писать не нужно.
Шаг 6. Редирект на внешний сайт
Обычный redirect('https://example.com') при определённых настройках может попытаться собрать URL относительно вашего домена. Для внешних адресов есть явный метод:
return redirect()->away('https://example.com');
away() отдаёт адрес как есть, без проверок и подстановок домена приложения.
Какой метод когда
| Задача | Метод |
|---|---|
| Уйти на конкретный внутренний URL | redirect('/path') |
| Уйти на маршрут по имени | redirect()->route('name') |
| Вернуть на предыдущую страницу | back() |
| Показать сообщение один раз | ->with('key', 'value') |
| Сохранить введённые данные формы | ->withInput() |
| Прикрепить ошибки валидации | ->withErrors($validator) |
| Уйти на внешний сайт | redirect()->away($url) |
Если не получилось
- Страница не редиректит, показывает пустоту или прежний контент. Скорее всего забыли
returnперед редиректом. Без него метод просто создаёт объект ответа и выбрасывает его. Редирект всегда возвращается из метода. - «Session store not set on request» или
back()ведёт на главную. Маршрут не в группеweb, где подключён middleware сессий. Проверьте, что маршрут описан вroutes/web.php, а неroutes/api.php. - Флеш-сообщение живёт после обновления страницы или не появляется вовсе. Проверьте, что читаете
session('status'), а неold('status')— это разные хранилища. - Ошибки валидации не показываются в шаблоне. Убедитесь, что вызвали
withErrors()при ручной валидации и что имя поля в@error('name')совпадает с ключом правила. UrlGenerationExceptionприroute(). Маршрут ждёт параметр, а вы его не передали. Посмотрите определение маршрута — часть в фигурных скобках нужно заполнить вторым аргументом.
Что дальше
Когда базовые редиректы работают, посмотрите на два соседних вопроса. Первый — redirect()->intended('/dashboard'): после логина возвращает пользователя туда, куда он шёл до того, как его перекинуло на страницу входа. Второй — коды ответа: по умолчанию редирект отдаёт 302, но для постоянных перемещений нужен 301, и он задаётся отдельно. Полный список методов редиректа смотрите в разделе HTTP Responses официальной документации для вашей версии — набор методов между минорными релизами меняется редко, но проверить стоит.
Репетитор 1—11 класс и ВУЗ: Математика и физика методом наведения на мысль, помощь с ДЗ.
Спросить за 8 ₽Источники: Laravel — HTTP Responses (Redirects), Laravel — Validation
Частые вопросы
У меня Laravel 10, а не 11 — примеры сработают?
Почему после return back() пользователь попадает на главную, а не на предыдущую страницу?
Чем redirect()->with() отличается от withInput()?
Флеш-сообщение показывается дважды или не исчезает — что не так?
Как сделать постоянный редирект 301 вместо временного 302?
Нужно ли писать withErrors вручную, если я использую Form Request?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.