- HTTP Redirects
- Redirecting To Named Routes
- Populating Parameters Via Eloquent Models
- Redirecting To Controller Actions
- Redirecting With Flashed Session Data
- HTTP Redirects
- Redirecting To Named Routes
- Populating Parameters Via Eloquent Models
- Redirecting To Controller Actions
- Redirecting With Flashed Session Data
- Русскоязычное комьюнити
- Обучающие ресурсы
- Блоги разработчиков
- Удаляем index.php из URL
- Удаляем index.php через код Laravel
- Редирект index.php в Nginx
- Редирект index.php в Apache
- Редирект index.php в Caddy
- HTTP редиректы
- Редиректы на именованные роуты
- Получение параметров из моделей Eloquent
- Редиректы на методы контроллера
- Редирект с данными сессии
- Русскоязычное комьюнити
- Обучающие ресурсы
- Блоги разработчиков
HTTP Redirects
Redirect responses are instances of the Illuminate\Http\RedirectResponse class, and contain the proper headers needed to redirect the user to another URL. There are several ways to generate a RedirectResponse instance. The simplest method is to use the global redirect helper:
Route::get('/dashboard', function () return redirect('/home/dashboard');>);
Sometimes you may wish to redirect the user to their previous location, such as when a submitted form is invalid. You may do so by using the global back helper function. Since this feature utilizes the session, make sure the route calling the back function is using the web middleware group or has all of the session middleware applied:
Route::post('/user/profile', function () // Validate the request. return back()->withInput();>);
Redirecting To Named Routes
When you call the redirect helper with no parameters, an instance of Illuminate\Routing\Redirector is returned, allowing you to call any method on the Redirector instance. For example, to generate a RedirectResponse to a named route, you may use the route method:
return redirect()->route('login');
If your route has parameters, you may pass them as the second argument to the route method:
// For a route with the following URI: profile/ return redirect()->route('profile', ['id' => 1]);
For convenience, Laravel also offers the global to_route function:
return to_route('profile', ['id' => 1]);
Populating Parameters Via Eloquent Models
If you are redirecting to a route with an «ID» parameter that is being populated from an Eloquent model, you may pass the model itself. The ID will be extracted automatically:
// For a route with the following URI: profile/ return redirect()->route('profile', [$user]);
If you would like to customize the value that is placed in the route parameter, you should override the getRouteKey method on your Eloquent model:
/** * Get the value of the model's route key. */public function getRouteKey(): mixed return $this->slug;>
Redirecting To Controller Actions
You may also generate redirects to controller actions. To do so, pass the controller and action name to the action method:
use App\Http\Controllers\HomeController; return redirect()->action([HomeController::class, 'index']);
If your controller route requires parameters, you may pass them as the second argument to the action method:
return redirect()->action( [UserController::class, 'profile'], ['id' => 1]);
Redirecting With Flashed Session Data
Redirecting to a new URL and flashing data to the session are usually done at the same time. Typically, this is done after successfully performing an action when you flash a success message to the session. For convenience, you may create a RedirectResponse instance and flash data to the session in a single, fluent method chain:
Route::post('/user/profile', function () // Update the user's profile. return redirect('/dashboard')->with('status', 'Profile updated!');>);
You may use the withInput method provided by the RedirectResponse instance to flash the current request’s input data to the session before redirecting the user to a new location. Once the input has been flashed to the session, you may easily retrieve it during the next request:
After the user is redirected, you may display the flashed message from the session. For example, using Blade syntax:
@if (session('status')) div class="alert alert-success"> < session('status') >> /div>@endif
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel attempts to take the pain out of development by easing common tasks used in most web projects.
HTTP Redirects
Redirect responses are instances of the Illuminate\Http\RedirectResponse class, and contain the proper headers needed to redirect the user to another URL. There are several ways to generate a RedirectResponse instance. The simplest method is to use the global redirect helper:
Route::get('/dashboard', function () < return redirect('/home/dashboard'); >);
Sometimes you may wish to redirect the user to their previous location, such as when a submitted form is invalid. You may do so by using the global back helper function. Since this feature utilizes the session, make sure the route calling the back function is using the web middleware group or has all of the session middleware applied:
Route::post('/user/profile', function () < // Validate the request. return back()->withInput(); >);
Redirecting To Named Routes
When you call the redirect helper with no parameters, an instance of Illuminate\Routing\Redirector is returned, allowing you to call any method on the Redirector instance. For example, to generate a RedirectResponse to a named route, you may use the route method:
return redirect()->route('login');
If your route has parameters, you may pass them as the second argument to the route method:
// For a route with the following URI: profile/ return redirect()->route('profile', ['id' => 1]);
For convenience, Laravel also offers the global to_route function:
return to_route('profile', ['id' => 1]);
Populating Parameters Via Eloquent Models
If you are redirecting to a route with an «ID» parameter that is being populated from an Eloquent model, you may pass the model itself. The ID will be extracted automatically:
// For a route with the following URI: profile/ return redirect()->route('profile', [$user]);
If you would like to customize the value that is placed in the route parameter, you should override the getRouteKey method on your Eloquent model:
/** * Get the value of the model's route key. * * @return mixed */ public function getRouteKey() < return $this->slug; >
Redirecting To Controller Actions
You may also generate redirects to controller actions. To do so, pass the controller and action name to the action method:
use App\Http\Controllers\HomeController; return redirect()->action([HomeController::class, 'index']);
If your controller route requires parameters, you may pass them as the second argument to the action method:
return redirect()->action( [UserController::class, 'profile'], ['id' => 1] );
Redirecting With Flashed Session Data
Redirecting to a new URL and flashing data to the session are usually done at the same time. Typically, this is done after successfully performing an action when you flash a success message to the session. For convenience, you may create a RedirectResponse instance and flash data to the session in a single, fluent method chain:
Route::post('/user/profile', function () < // Update the user's profile. return redirect('/dashboard')->with('status', 'Profile updated!'); >);
You may use the withInput method provided by the RedirectResponse instance to flash the current request’s input data to the session before redirecting the user to a new location. Once the input has been flashed to the session, you may easily retrieve it during the next request:
After the user is redirected, you may display the flashed message from the session. For example, using Blade syntax:
@if (session('status')) div class="alert alert-success"> > div> @endif
Русскоязычное комьюнити
Обучающие ресурсы
Блоги разработчиков
Удаляем index.php из URL
Если у вас есть проект на Laravel, то вы удивитесь, обнаружив, что ваши маршруты открываются по разным URL-адресам.
Например, допустим, что у нас такой файл маршрутов:
Route::view('/feature/uptime-monitoring', 'front/feature/uptime-monitoring');
Это создаст, как вы ожидаете, маршрут yourdomain.tld/feature/uptime-monitoring
Но для большинства вебсерверов это означает, что следующие URL-адреса также являются действительными и будут возвращать HTTP/1.1 200 OK с той же страницей:
Что там делает index.php ? Это необходимо для некоторых хостингов, которые не поддерживают семантические адреса.
Но вам вряд ли это нужно, так что давайте избавимся от него!
Удаляем index.php через код Laravel
Один из способов удаления — проверить маршрут в Laravel и, при необходимости, сделать редирект.
Один из вариантов сделать это в app/Providers/RouteServiceProvider.php .
use Illuminate\Support\Str; class RouteServiceProvider extends ServiceProvider < public function map(Router $router) < $this->removeIndexPhpFromUrl(); > protected function removeIndexPhpFromUrl() < if (Str::contains(request()->getRequestUri(), '/index.php/')) < $url = str_replace('index.php/', '', request()->getRequestUri()); if (strlen($url) > 0) < header("Location: $url", true, 301); exit; >> > >
При обнаружении index.php в любом URL будет сделан редирект.
$ curl -I "http://yourdomain.tld/index.php/pricing" HTTP/1.1 301 Moved Permanently Location: /pricing $ curl -i "http://yourdomain.tld/index.php/feature/uptime-monitoring" HTTP/1.1 301 Moved Permanently Location: /feature/uptime-monitoring
Есть несколько альтернативных способов получения того же результата на уровне вебсервера.
Редирект index.php в Nginx
Возможно, вам придется повторить этот блок для каждого блока location <> , если в вашей конфигурации Nginx их несколько.
Редирект index.php в Apache
Вы можете добавить дополнительную строку в свой .htaccess.
RewriteEngine On # Redirect if index.php is in the URL RewriteRule ^index.php/(.+) /$1 [R=301,L]
По крайней мере, это простая регулярка/фикс 🙂
Редирект index.php в Caddy
Получается немного громоздко, но, главное, работает для Caddy.
$ cat Caddyfile https:// < tls < ask https://ohdear.app/caddy/allowed-domain >rewrite < regexp ^/index.php/(.*) to /> redir < if not / > >
Требуется внутренний rewrite , чтобы найти index.php , а затем redir для редиректа запроса.
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
HTTP редиректы
Отклики для редиректов — это экземпляры класса Illuminate\Http\RedirectResponse ; они содержат соответствующие заголовки, необходимые для переадресации пользователя на другой URL. Есть несколько способов создания экземпляров RedirectResponse . Самый простой способ — использовать глобальный хелпер redirect :
Route::get('dashboard', function () < return redirect('home/dashboard'); >);
Иногда необходимо перенаправить пользователя в предыдущее место, например, когда в отправленной форме обнаружены ошибки. Вы можете сделать это с помощью глобального хелпера back . Так как для этой функции используются сессии, убедитесь в том, что вызывающий функцию back роут использует группу посредников web или использует всех посредников сессий:
Route::post('user/profile', function () < // Проверка запроса. return back()->withInput(); >);
Редиректы на именованные роуты
При вызове хелпера redirect без параметров возвращается экземпляр Illuminate\Routing\Redirector , позволяя вам вызывать любой метод на экземпляре Redirector . Например, вы можете использовать метод route , чтобы сгенерировать RedirectResponse на именованный роут:
return redirect()->route('login');
Если у вашего роута есть параметры, то вы можете передать их в качестве второго аргумента метода route :
// Для роута со следующим URI: profile/ return redirect()->route('profile', ['id' => 1]);
Получение параметров из моделей Eloquent
Если вы делаете переадресацию на роут с параметром «ID», который был получен из модели Eloquent, то вы можете передать саму модель. ID будет извлечён автоматически:
// Для роута со следующим URI: profile/ return redirect()->route('profile', [$user]);
Если вы хотите изменить значение, которое помещается в параметр роута, вам надо переопределить метод getRouteKey в вашей модели Eloquent:
/** * Получить значение ключа роута модели. * * @return mixed */ public function getRouteKey() < return $this->slug; >
Редиректы на методы контроллера
Также вы можете создать редиректы на методы контроллера. Для этого передайте контроллер и имя метода контроллера в метод action . Помните, что вам не надо указывать полное пространство имён контроллера, потому что RouteServiceProvider Laravel автоматически задаст его сам:
return redirect()->action('HomeController@index');
Если роуту вашего контроллера нужны параметры, то вы можете передать их вторым аргументом метода action :
return redirect()->action( 'UserController@profile', ['id' => 1] );
Редирект с данными сессии
Редирект на новый URL и передача данных в сессию обычно происходят одновременно. Обычно это делается после успешного выполнения действия, когда вы передаёте в сессию сообщение об успехе. Для удобства вы можете создать экземпляр RedirectResponse и передать данные в сессию в одной цепочке вызовов:
Route::post('user/profile', function () < // Обновление профайла юзера. return redirect('dashboard')->with('status', 'Profile updated!'); >);
Когда пользователь переадресован, то вы можете вывести сообщение из сессии. Например, используя синтаксис Blade:
@if (session('status')) div class="alert alert-success"> > div> @endif