【问题标题】:Is it possible to have multiple domain handled by one laravel app?一个 laravel 应用程序可以处理多个域吗?
【发布时间】:2020-05-22 19:57:38
【问题描述】:

假设我有 domain1.com 和 domain2.com。我希望它们都指向同一个 laravel 应用程序,但显示不同的页面。例如,domain1.com 将引用将呈现页面 X 的控制器 X,而 domain2.com 将引用将呈现页面 Y 的控制器 Y。这可能吗?如果是这样,我将如何编码路由?请记住,我不是在谈论子域。

【问题讨论】:

    标签: laravel routes


    【解决方案1】:

    您可以制作多个网络路由文件。

    然后在RouteServiceProvider.php中的mapWebRoutes()方法中根据主机名切换路由文件。

        protected function mapWebRoutes()
        {
            $request = $this->app->make(Request::class);
    
            if ($request->getHost() === "example.com") {
                Route::middleware('web')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/example.com.web.php'));
            } else {
                Route::middleware('web')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/othersite.com.web.php'));
            }
        }
    

    如果您需要将控制器拆分为单独的命名空间(以避免混淆),您也可以通过指定命名空间在该方法中进行管理。

    更新:

    根据 cmets 的要求,如何在路由文件中使用 if 的示例:

    //routes/web.php
    
    if (request()->getHost() === "example.com") {
        Route::get('/', 'OneController@index');
    } else {
        Route::get('/', 'AnotherController@index');
    }
    

    【讨论】:

    • 就我而言,指向同一个 laravel 应用程序的各种域只会引用相同的 1 或 2 个控制器。然后,这些控制器将根据域动态生成视图,所以我认为对于我的情况来说,让每个域都有自己的 web 文件有点矫枉过正。至少在我看来。或许你对此有不同的看法?如果我只使用 1 个网络文件,我会怎么做?另外,我将如何处理带有动态域的路由?例如,如果用户已经有一个他们想要使用的域。
    • @FirdausIndradhirmaya 如果您的要求不那么重要,您的路线文件中可能会有一些条件。但是如果它只是一两个控制器,为什么不根据在所述控制器方法中显示什么视图来决定呢。
    • 您能否说明如何在基于主机的路由文件中设置条件? $request = $this->app->make(Request::class); if ($request->getHost() === "example.com") { Route::post('/', 'example_controller@example_method'); } 你的意思是这样吗?
    • 谢谢!真的很大帮助,虽然我现在无法测试它,因为我的项目还没有。一旦我下周有时会进入我的项目的那部分,我会接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2018-08-09
    • 2013-03-21
    • 2011-08-27
    • 2018-04-04
    • 2010-10-22
    相关资源
    最近更新 更多