Неожиданные переадресации Laravel (302)
Я начал новый проект Laravel 5.2, используя laravel new MyApp
и добавив аутентификацию через php artisan make:auth
. Это предназначено только для веб-сайта, в котором первый пользователь загружается, и создает остальные (без ручного создания пользователя/пароля reset/и т.д.).
Это маршруты, которые я определил в настоящее время:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\[email protected]']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\[email protected]' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> '[email protected]']);
Route::get( 'user/{uid?}', ['as' => 'user.profile', 'uses' => 'Auth\[email protected]' ]);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\[email protected]' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => 'Auth\[email protected]']);
[...]
});
});
Я могу войти в систему просто отлично, но я испытываю какое-то очень "фанковое" поведение - когда я пытаюсь выйти из системы (через встроенный метод logout
, который был создан с помощью мастера), страница перенаправляет 302 на домой, и я все еще вошел в систему.
Что еще, в то время как почти все страницы (не перечисленные здесь) работают так, как ожидалось, user.add также создает 302 на домашней странице.
Обратите внимание, что главная страница объявляется AuthController как $redirectTo
, если это имеет значение
Я узнал о переадресации через debugbar. Любая идея о том, что искать?
Ответы
Ответ 1
После нескольких часов вытягивания волос я нашел свой ответ - и это глупо.
Проблема заключается в том, что маршрут user.profile
имеет путь user/{uid?}
и соответствует как user/logout
, так и user/add
как пути.
Это перед другими, и не имея регулярного выражения или подобного, оно обрабатывало маршрут.
Я до сих пор не знаю, почему 302 был создан для этой страницы, но обнаружил, что перемещение его из AuthController
и в UserController
(где должно быть с самого начала) исправлено поведение.
Таким образом, мои (измененные и рабочие) маршруты теперь выглядят так:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\[email protected]']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\[email protected]' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> '[email protected]']);
Route::get( '/home', ['as'=>'home', 'uses'=> '[email protected]']);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\[email protected]' ]);
// *** Added /profile/ here to prevent matching with other routes ****
Route::get( 'user/profile/{uid?}', ['as' => 'user.profile', 'uses' => '[email protected]' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => '[email protected]']);
[...]
});
});
Ответ 2
Я столкнулся с проблемой с 302 перенаправлениями при публикации запросов AJAX. Решением в этом случае было забыть включить токен CSRF.
Смотрите документы Laravel 5.4 здесь: https://laravel.com/docs/5.4/csrf
Ответ 3
Может быть перенаправлена по умолчанию после выхода из системы home
и кажется, что у вас нет home
в вашем маршруте web
. Попробуйте приведенный ниже код в AuthController.php
use AuthenticatesAndRegistersUsers, ThrottlesLogins; // after this line
$redirectAfterLogout = 'login' // add this line
Это приведет к перенаправлению на страницу login
после выхода из системы. Вы можете изменить его на любой маршрут, если хотите. В качестве примера я использовал login
.
ИЛИ
Вы можете изменить маршрут выхода из системы в \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
public function logout()
{
Auth::logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : 'login');
}
Я изменил маршрут по умолчанию на login
. Если у вас нет $redirectAfterLogout
в AuthController.php
, он будет искать здесь путь перенаправления. Я не предлагаю людям редактировать здесь, это своего рода жесткое кодирование.
Ответ 4
У меня была эта проблема, и оказалось, что у меня есть маршрут: перенаправление внутри моего контроллера ajax.
что не имеет смысла, потому что, очевидно, нам нужно вернуть ajax, но я возвращал маршрут!
Ответ 5
Я получил ту же проблему и решил ее, добавив заголовок с помощью accept: 'application/json'. И я думаю, что проверил исходный код, прежде чем он указывает, что, если вы не добавите это, он может перенаправить, когда вы используете промежуточное программное обеспечение аутентификации. Но я не уверен, так ли это, и я не могу вспомнить, где я нашел это.