为什么 Laravel 登录后重定向到错误的路径?
Why is Laravel redirecting to wrong path after login?
我有一个 Laravel 5.8 项目。
当我登录时,它应该转到 /dashboard。
但它会转到 http://localhost:8000/img/favicon/favicon.png
favicon.png 是嵌入在 app.blade.php 中的资源。
只有当我在路由 '/dashboard' 上使用 auth 中间件时才会发生。
类似问题:Wrong redirection after Login in Laravel,但没有解决方案。
当我使用
file_put_contents("bugfix.log",print_r($request,true));
在 Authenticate.php 中部分解决了问题,但当用户注销并转到 /dashboard 时出现内存耗尽错误。
app/http/middleware/Authenticate.php(授权中间件):
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
// print_r($request,true);
// file_put_contents("bugfix.log",print_r($request,true));
// the above file_put..... code is a strange fix to a problem :
// i.e. when a user logs in he redirects to http://127.0.0.1:8000/js/es6-promise.map in firefox and http://127.0.0.1:8000/img/favicon/favicon.png in chrome
if (! $request->expectsJson()) {
return route('login');
}
return null;
}
}
routes/web.php
<?php
Auth::routes(['verify' => true ]);
Route::get('/logout-manual', function () {
request()->session()->invalidate();
});
Route::get('/', 'HomeController@index')->name('home');
Route::get('/tasks', 'TaskController@alltasks')->name('tasks')->middleware('auth');
Route::get('/login/{provider}', 'Auth\SocialAccountController@redirectToProvider');
Route::get('/login/{provider}/callback', 'Auth\SocialAccountController@handleProviderCallback');
Route::get('/dashboard', 'TaskController@alltasks')->middleware('auth');
Route::get('/{any}', 'TaskController@alltasks')->middleware('auth')->where('any', '.*');
app/http/controllers/Auth/LoginController.php
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/dashboard';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'abc') }}</title>
<!-- Styles -->
<link href="{{ asset('css/admin.css') }}" rel="stylesheet">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- Favicon -->
<link rel="shortcut icon" href="{{ asset('img/favicon/favicon.png') }}">
<!-- Icons -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.css" rel="stylesheet">
</head>
<body class="d-flex flex-column h-100">
<div id="app" class="flex-shrink-0">
@yield('content')
</div>
<!-- Scripts -->
<script type="application/javascript" src="{{ asset('js/jquery.min.js') }}"></script>
<script type="application/javascript" src="{{ asset('js/app.js') }}" defer></script>
<script type="application/javascript" src="{{ asset('js/abc.js') }}"></script>
<script type="application/javascript" src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
</body>
</html>
如何解决此问题,以便在用户登录时转到 http://localhost:8000/dashboard 而不是 http://localhost:8000/img/favicon/favicon.png?
似乎预期的 url 在会话中被覆盖为 /img/favicon/favicon.png
。查看提供的代码,我认为您的网站图标不存在,当它加载到您的登录页面时,它会触发您的捕获所有路由。
此路由使用 auth
中间件触发预期的 url 被设置。由于您的网站图标已加载到您的登录页面,因此它会将 url 设置为那个。
要解决此问题,您可以添加网站图标,为所有路由添加前缀,例如 /tasks/
或更新 where.
的正则表达式
下面的示例确保当 url 以 /img
开头时路由不匹配。
Route::get('/{any}', 'TaskController@alltasks')->middleware('auth')->where('any', '^(?!img).*');
我个人会将所有资产移动到 assets
目录中。这样,我不必排除 /img
、/css
和 /js
,而只需排除 /assets
.
我有一个 Laravel 5.8 项目。 当我登录时,它应该转到 /dashboard。 但它会转到 http://localhost:8000/img/favicon/favicon.png favicon.png 是嵌入在 app.blade.php 中的资源。 只有当我在路由 '/dashboard' 上使用 auth 中间件时才会发生。
类似问题:Wrong redirection after Login in Laravel,但没有解决方案。 当我使用
file_put_contents("bugfix.log",print_r($request,true));
在 Authenticate.php 中部分解决了问题,但当用户注销并转到 /dashboard 时出现内存耗尽错误。
app/http/middleware/Authenticate.php(授权中间件):
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
// print_r($request,true);
// file_put_contents("bugfix.log",print_r($request,true));
// the above file_put..... code is a strange fix to a problem :
// i.e. when a user logs in he redirects to http://127.0.0.1:8000/js/es6-promise.map in firefox and http://127.0.0.1:8000/img/favicon/favicon.png in chrome
if (! $request->expectsJson()) {
return route('login');
}
return null;
}
}
routes/web.php
<?php
Auth::routes(['verify' => true ]);
Route::get('/logout-manual', function () {
request()->session()->invalidate();
});
Route::get('/', 'HomeController@index')->name('home');
Route::get('/tasks', 'TaskController@alltasks')->name('tasks')->middleware('auth');
Route::get('/login/{provider}', 'Auth\SocialAccountController@redirectToProvider');
Route::get('/login/{provider}/callback', 'Auth\SocialAccountController@handleProviderCallback');
Route::get('/dashboard', 'TaskController@alltasks')->middleware('auth');
Route::get('/{any}', 'TaskController@alltasks')->middleware('auth')->where('any', '.*');
app/http/controllers/Auth/LoginController.php
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/dashboard';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'abc') }}</title>
<!-- Styles -->
<link href="{{ asset('css/admin.css') }}" rel="stylesheet">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- Favicon -->
<link rel="shortcut icon" href="{{ asset('img/favicon/favicon.png') }}">
<!-- Icons -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.css" rel="stylesheet">
</head>
<body class="d-flex flex-column h-100">
<div id="app" class="flex-shrink-0">
@yield('content')
</div>
<!-- Scripts -->
<script type="application/javascript" src="{{ asset('js/jquery.min.js') }}"></script>
<script type="application/javascript" src="{{ asset('js/app.js') }}" defer></script>
<script type="application/javascript" src="{{ asset('js/abc.js') }}"></script>
<script type="application/javascript" src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
</body>
</html>
如何解决此问题,以便在用户登录时转到 http://localhost:8000/dashboard 而不是 http://localhost:8000/img/favicon/favicon.png?
似乎预期的 url 在会话中被覆盖为 /img/favicon/favicon.png
。查看提供的代码,我认为您的网站图标不存在,当它加载到您的登录页面时,它会触发您的捕获所有路由。
此路由使用 auth
中间件触发预期的 url 被设置。由于您的网站图标已加载到您的登录页面,因此它会将 url 设置为那个。
要解决此问题,您可以添加网站图标,为所有路由添加前缀,例如 /tasks/
或更新 where.
下面的示例确保当 url 以 /img
开头时路由不匹配。
Route::get('/{any}', 'TaskController@alltasks')->middleware('auth')->where('any', '^(?!img).*');
我个人会将所有资产移动到 assets
目录中。这样,我不必排除 /img
、/css
和 /js
,而只需排除 /assets
.