Laravel意外重定向(302)

时间:2016-01-26 17:50:45

标签: php laravel-5

我使用laravel new MyApp启动了一个新的Laravel 5.2项目,并通过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']);

    [...]
  });
});

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

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

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

我通过调试栏发现了重定向。想知道该找什么?

11 个答案:

答案 0 :(得分:7)

经过几个小时的拔毛,我找到了答案 - 而且很傻。

问题是,路由user.profile的路径为user/{uid?},并且路径user/logoutuser/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']);

    [...]
    });
});

答案 1 :(得分:7)

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

请在此处查看Laravel 5.4文档:https://laravel.com/docs/5.4/csrf

答案 2 :(得分:1)

注销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,则会在此处查找重定向路径。我不建议人们在这里编辑,这是一种硬编码。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我遇到了这个问题,事实证明我有一条路线:在我的ajax控制器内重定向。 这没有任何意义,因为显然我们必须返回ajax,但我正在返回一条路线!

答案 5 :(得分:0)

我也曾在登录页面上遇到过此问题,该页面以前运行良好。因此,请考虑一下目录权限,结果如下:

drwxr-xr-x  7 user user     4096 Jun 27  2019 storage

因此,存储目录具有755权限,这意味着只有所有者才具有写访问权,由于该目录由“用户”拥有,因此其他用户(如laravel)无法写入该目录。

使用此cmd将目录更改为777可解决我的问题:

sudo chmod 777 -R PROJECT_PATH/storage

正确的方法

由于将该目录设置为全球可写状态不是正确的方法,因此请将该目录归apache所有,并将775设置为storage ..然后它又可以工作了。

sudo chown -R user:www-data PROJECT_PATH/storage
sudo chmod 775 -R PROJECT_PATH/storage

答案 6 :(得分:0)

对我来说,它是guest中间件!

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

答案 7 :(得分:0)

我使用了很多ajax(获取和发布),每次响应时,我在服务器上使用session()->regenerate()更新令牌,然后在客户端使用js更新每个令牌字段。 但是上周,我错误地删除了一个班轮功能。因此,突然在第二个呼叫之后,系统开始给出302响应。很难找到正在发生的事情,因为它有时(firstime)有效,有时却不起作用。 在意识到这是令牌不匹配之后,我努力了几天,试图找出原因,因为响应中没有指出令牌不匹配,只是重定向了302。 最后,我通过tokensMatch()函数上的两个标记dd()找到了问题。我不知道为什么它不会触发TokenMismatch。

希望这个轶事对您有所帮助。

答案 8 :(得分:0)

对我来说,这就是我的控制器中的内容:

public function __construct()
{
   $this->middleware('admin');
}

答案 9 :(得分:0)

对我来说是config / session.php

我在那里更改了一些生产应用程序的值,例如路径,安全性,same_site

但是由于http:// localhost在本地,安全会话未能创建任何cookie。

这就是为什么身份验证中间件重定向到状态为302的登录页面的原因

答案 10 :(得分:0)

如果您的网站不使用 HTTPS,则必须在 .env 中定义以下属性

SESSION_SAME_SITE=Strict

注意:此预防措施被某些浏览器用于防止网站用户被利用