Неожиданные переадресации 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'. И я думаю, что проверил исходный код, прежде чем он указывает, что, если вы не добавите это, он может перенаправить, когда вы используете промежуточное программное обеспечение аутентификации. Но я не уверен, так ли это, и я не могу вспомнить, где я нашел это.