【问题标题】:Sub-Domain Routing Laravel 5子域路由 Laravel 5
【发布时间】:2015-09-10 23:30:17
【问题描述】:

我一直在 Laravel 5 中测试子域路由功能,并成功使用了文档中描述的以下代码。当用户访问 {username}.mysite.com 时,用户个人资料视图按预期显示。

Route::group(['domain' => '{username}.{tld}'], function () {
    Route::get('user/{id}', function ($username, $id) {
        //
    });
});

但是,我期待的行为与我所经历的有所不同。当用户通过子域访问该站点时,我视图中的所有链接现在都保留了其中的子域。所有其他链接,如 {username}.mysite.com/home{username}.mysite.com/login 等......功能齐全,但我不明白为什么 Laravel 用子域填充我的所有链接和/或我如何摆脱这个并且仅保留单个路由的子域。我希望我视图中的所有其他链接都像mysite.com/homemysite.com/login。我希望只使用{username}.mysite.com 作为网站访问者的快速访问点,而不是在所有视图中保留它。

我可以做些什么来改变这种行为?

【问题讨论】:

    标签: php laravel-5 wildcard-subdomain


    【解决方案1】:

    将您不希望以路由组之外的子域作为前缀的路由:

    // These routes won’t have the subdomain
    $router->controllers([
        'auth' => 'Auth\AuthController',
        'password' => 'Auth\PasswordController',
    ]);
    
    // These routes WILL have the subdomain
    $router->group(['domain' => '{username}.{tld}'], function ($router) {
        $router->get('/', 'UserDashboard@index');
    
        $router->controller('account', 'AccountController');
    
        $router->resource('users', 'UserController');
    });
    

    【讨论】:

    • 这段代码要放在RouteServiceProvider.phpmap函数中吗?
    • 不,您的路线文件。您可以使用Route 外观或$router 变量。如您所见,我更喜欢后者,但它们都产生相同的结果。
    • 可以反过来吗?也就是说,定义将使用前缀的控制器子集?请注意,我没有使用 RESTful 约定。 $router->group(['domain' => '{username}.{tld}'], function ($router) { $router->controllers(['/' => 'SubdomainController']); });
    • 我不确定我是否从您的示例代码中理解,因为您无法将控制器映射到根 (/),所以这不起作用。不过,您可以像在组外一样在组内定义资源控制器。
    • 好的,忽略之前的评论。将控制器添加到 $router->controllers 数组中,我的视图中的所有链接仍然以子域为前缀。也许我需要后退一步。我真的只想要一个子域链接可以访问{username}.mysite.com。其余链接应仅指向mysite.com
    【解决方案2】:

    你忘了重定向用户...所以:

    首先,正如 Martin Bean 所建议的,从子域组中排除不需要的控制器。

    其次,在用户成功登录后 - 将他重定向到没有子域的地址。你可以通过用你的实现覆盖auth中间件来做到这一点(它必须实现TerminableMiddleware接口)。

    我。 e.:

    1. 用户在页面 https://auth.example.com 上并登录。
    2. 您对 auth 中间件的覆盖检查是否成功登录。
    3. ...并将用户重定向到https://example.com/home 或其他...

    应该够了。

    【讨论】:

      【解决方案3】:

      我发现我的所有链接/路由都以子域为前缀的问题,即使它们位于路由组之外。问题在于 Illuminate HTML 链接构建器。它呈现相对链接而不是完整的绝对链接。

      所以不要使用:{!! HTML::link('contact', 'Contact Us') !!}

      我应该使用:{!! HTML::linkRoute('contact_route_name', 'Contact Us') !!}

      linkRoute() 函数会考虑路由组并根据需要应用子域。

      【讨论】:

        猜你喜欢
        • 2015-10-01
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 2020-01-04
        • 2016-09-18
        • 2016-09-25
        • 1970-01-01
        相关资源
        最近更新 更多