Laravel 5 Route Group 和 Basic(/) GET Route 组内

Posted

技术标签:

【中文标题】Laravel 5 Route Group 和 Basic(/) GET Route 组内【英文标题】:Laravel 5 Route Group and Basic(/) GET Route within group 【发布时间】:2015-09-01 11:43:44 【问题描述】:

我正在开发一个带有管理面板的 Laravel 5.0 Web 应用程序。 我正面临路线问题。我有如下分组的管理路由,

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['user.admin']], function () 
    Route::get('login', [
        'as' => 'admin.login',
        'uses' => 'AuthController@getLogin'
    ]);
    Route::get('logout', [
        'as' => 'admin.login',
        'uses' => 'AuthController@getLogout'
    ]);
    Route::post('login', 'AuthController@postLogin');
);

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['user.admin','auth', 'admin.acl']], function () 

    Route::get('dashboard', [
        'as'         => 'admin.dashboard',
        'uses'       => 'DashboardController@index',
        'permission' => 'admin_dashboard'
    ]);

    //Image Handler
    Route::get('images/size/name?',[
        'as'   => 'admin.images',
        'uses' => 'ImagesController@images'
    ]);

    Route::resource('user', 'UsersController');

    ........   

);

一切正常。我可以毫无问题地使用以下功能,

http://domain.com/admin/dashboard
http://domain.com/admin/login

但我想要

http://domain.com/admin

显示登录页面或重定向到

http://domain.com/admin/login

所以我把我的第一组改为跟随,

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['user.admin']], function () 

    Route::get('/', [        
        'uses' => 'AuthController@getLogin'
    ]);
    Route::get('login', [
        'as' => 'admin.login',
        'uses' => 'AuthController@getLogin'
    ]);
    Route::get('logout', [
        'as' => 'admin.login',
        'uses' => 'AuthController@getLogout'
    ]);
    Route::post('login', 'AuthController@postLogin');
);

现在当我访问时

http://domain.com/admin

我在 chrome 中收到“此网页有重定向循环”。路由组可以吗?如果不是,如何使用 .htaccess 执行此操作?

更新

下面是中间件user.adminhandle方法。这只会改变身份验证的底层模型。

    public function handle($request, Closure $next)
    
        \Config::set('auth.table', 'admins');
        \Config::set('auth.model', 'App\DB\Admin\Admin');

        \Config::set('session.cookie', 'admin_session');
        \Config::set('session.path', '/admin/');

        return $next($request);
    

更新

这太棒了,下面的作品

http://domain.com/index.php/admin

我没有碰过laravel 5.0提供的默认.htaccess,如下图,

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

我有将近 60-70 条路线,在上述我需要 index.php 的情况下,它们都可以在没有 index.php 接受的情况下工作。

【问题讨论】:

请发布您的中间件 @Szenis- 谢谢。我已经更新了我的答案。 你能尝试最后声明'/'路由吗?我想知道评估路线的顺序是什么。 【参考方案1】:

问题是“user.admin”中间件始终在运行,即使在“/admin/login”上也是如此。因此,当您访问“/admin”时,您会被重定向到“/admin/login”,然后中间件会再次将您重定向到“/admin/login”,这将永远发生。这就是您收到“此网页有重定向循环”的原因。

为了使其正常工作,您必须将“admin/login”排除在使用“user.admin”中间件之外。

【讨论】:

【参考方案2】:

您可以不带任何前缀,只需添加一个执行重定向的路由“admin”:

// responds to http://domain.com/admin
Route::get('admin', function()
  if (//User not authenticated)
    return redirect()->to('admin/login');
  else
    //show admin;
);

【讨论】:

@dynamic-thanks。早些时候我尝试了几乎同样的事情。我使用“返回重定向(路由('admin.login'));”它不起作用。可能是因为 route() 在 Routes 文件中毫无意义。我会试试你的解决方案。【参考方案3】:

问题可能是由公共目录中名为admin 的文件夹引起的。

【讨论】:

以上是关于Laravel 5 Route Group 和 Basic(/) GET Route 组内的主要内容,如果未能解决你的问题,请参考以下文章

laravel 配置多域名最简单的方法

Laravel Routing笔记

Laravel 5高级路由

如何在 Laravel 4 中为 Route::group 设置正则表达式参数约束?

为啥不能在 Laravel 5.7 中捕获我定义的 Route 请求的文件 URI?

我可以在 Laravel 中向 Route::group 添加参数,但在调度到 Laravel 中的路由之前将其删除吗?