要让 login.html 页面不进行 Session 验证,避免用户未登录时被重定向,可按以下方法调整中间件配置:
1. 路由中间件方案(推荐)
修改路由定义,把登录路由排除在中间件验证范围之外:
php
// app/route/route.php
use think\facade\Route;
// 公开路由(无需验证)
Route::group('admin', function () {
Route::get('login', 'admin/Login/index'); // 登录页面
Route::post('login', 'admin/Login/login'); // 登录处理
})->allowCrossDomain();
// 需要验证的后台路由
Route::group('admin', function () {
// 其他后台路由...
})->middleware(\app\middleware\AdminAuth::class);
2. 中间件内排除特定路径
修改中间件代码,在验证时跳过登录相关路径:
php
<?php
namespace app\middleware;
class AdminAuth
{
public function handle($request, \Closure $next)
{
// 排除登录页面和登录接口
$path = $request->pathinfo();
if (strpos($path, 'admin/login') === 0) {
return $next($request);
}
// 检查用户是否登录
if (!session('?admin_id')) {
return redirect(url('admin/login/index'));
}
return $next($request);
}
}
3. 控制器中间件方案
创建基础控制器,只在需要验证的控制器中继承它:
php
<?php
namespace app\controller\admin;
use think\Controller;
// 无需验证的基础控制器
class PublicBase extends Controller
{
// 空实现,不添加中间件
}
// 需要验证的基础控制器
class AuthBase extends Controller
{
protected $middleware = [\app\middleware\AdminAuth::class];
}
// 登录控制器继承PublicBase
class Login extends PublicBase
{
public function index()
{
return view(); // 直接显示login.html
}
}
// 管理控制器继承AuthBase
class Index extends AuthBase
{
public function index()
{
return view(); // 需要登录才能访问
}
}
注意事项
-
确保登录表单的提交路径与路由定义一致,例如:
html<form action="/admin/login" method="post"> <!-- 表单内容 --> </form> -
若使用了模板引擎,可通过路由变量渲染登录页面,而非直接访问 HTML 文件:
phpRoute::get('login', 'admin/Login/index'); // 控制器方法返回view('login')
通过上述任意一种方案,都能确保 login.html 页面可被未登录用户正常访问,同时其他后台页面仍受 Session 验证保护。