Laravel意外重定向(302)

Nic*_*los 15 php laravel-5

我已经启动了一个新的Laravel 5.2项目,使用laravel new MyApp并添加了身份验证php artisan make:auth.这是一个仅限会员的网站,其中第一个用户是种子,并创建其余的(没有手动用户创建/密码重置/等).

这些是我目前定义的路线:

 Route::group(['middleware' => 'web'], function () {
  // Authentication Routes...
  Route::get( 'user/login',  ['as' => 'user.login',     'uses' => 'Auth\AuthController@showLoginForm']);
  Route::post('user/login',  ['as' => 'user.doLogin',   'uses' => 'Auth\AuthController@login'        ]);

  Route::group(['middleware' => 'auth'], function() {
    // Authenticated user routes
    Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
    Route::get( 'user/{uid?}', ['as' => 'user.profile',   'uses' => 'Auth\AuthController@profile' ]);
    Route::get( 'user/logout', ['as' => 'user.logout',    'uses' => 'Auth\AuthController@logout'  ]);
    Route::get( '/user/add',   ['as' => 'user.add',       'uses' => 'Auth\AuthController@showAddUser']);

    [...]
  });
});
Run Code Online (Sandbox Code Playgroud)

我可以登录很好,但是我遇到了一些非常"时髦"的行为 - 当我尝试注销时(logout通过工匠创建的内置方法),页面会重定向到家,我仍然登录.

更重要的是,虽然几乎所有页面(此处未列出)都按预期工作,但user.add也会在主页上生成302.

请注意,主页是向AuthController声明的$redirectTo,如果这有任何区别

我通过调试栏找到了重定向.想知道该找什么?

小智 16

我遇到了同样的问题,我通过添加带有 accept:'application/json' 的标头解决了它。而且我想我之前检查了源代码,它表明如果您不添加它,它可能会在您使用 auth 中间件时重定向。但我不确定是否是这种情况,我不记得我在哪里找到的。

  • 我可以确认这为我解决了问题。请求无效(`$this->validate($request...)` 正在返回重定向),但 Laravel 没有检测到请求是从 Ajax 发出的,因此它没有返回 JSON 对象,而是尝试重定向. 我正在使用 Laravel 5.3。 (8认同)

mis*_*lly 9

发布ajax请求时遇到302重定向问题.在这种情况下的解决方案是记住包括CSRF令牌.

请参阅Laravel 5.4文档:https://laravel.com/docs/5.4/csrf


Nic*_*los 8

经过数小时的拔头发,我找到了答案-这很愚蠢。

问题是,该航线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\AuthController@showLoginForm']);
  Route::post('user/login',  ['as' => 'user.doLogin',   'uses' => 'Auth\AuthController@login'        ]);

  Route::group(['middleware' => 'auth'], function() {
    // Authenticated user routes
    Route::get( '/',     ['as'=>'home', 'uses'=> 'HomeController@index']);
    Route::get( '/home', ['as'=>'home', 'uses'=> 'HomeController@home']);
    Route::get( 'user/logout', ['as' => 'user.logout',    'uses' => 'Auth\AuthController@logout'  ]);

    // *** Added /profile/ here to prevent matching with other routes ****
    Route::get( 'user/profile/{uid?}', ['as' => 'user.profile',   'uses' => 'UserController@profile' ]);
    Route::get( '/user/add',           ['as' => 'user.add',       'uses' => 'UserController@showAddUser']);

    [...]
    });
});
Run Code Online (Sandbox Code Playgroud)


Ahm*_*aki 5

对我来说它是guest中间件!

如果经过身份验证,此中间件会将用户重定向到主页。您不必将其用于Api请求。所以我删除了它,问题解决了。