【问题标题】:Laravel - CNAME + Subdomain RoutingLaravel - CNAME + 子域路由
【发布时间】:2016-09-18 12:38:10
【问题描述】:

我的路线设置如下:

<?php

Route::group([
    'domain' => '{username}.u.'.env('APP_DOMAIN'),
], function () {
    Route::get('/', 'FrontendController@site');
});

Route::group([
    'domain' => env('APP_DOMAIN'),
], function () {
    // Regular site routes
});

Route::group([
    'domain' => '{domain}',
], function () {
    Route::get('/', 'FrontendController@domain');
});

我想要实现的是允许用户拥有自己的网站,例如hello.u.domain.com,并且这些站点也可以通过自定义域提供服务,该域是 CNAME 到其子域的。使用上面的路由,通配符子域可以正常工作。但是,自定义域路由永远不会被击中;每当访问 CNAME 到子域的自定义域时,都会使用常规站点路由。

APP_DOMAIN 与自定义域不一样,我的RouteServiceProvider.php 中有$router-&gt;pattern('domain', '[a-z0-9.]+'); 允许{domain} 作为完整域名。

【问题讨论】:

  • 如果我理解正确,route() 函数会返回一个类似 website.com 而不是 user.u.website.com 的 url?如果是这种情况,我会发布答案。

标签: laravel laravel-5 laravel-5.2 laravel-routing


【解决方案1】:

您不能在整个域中使用通配符,至少不能使用一个通配符。您可以执行以下操作:

Route::group([
    'domain' => '{domain}.{suffix}',
], function () {
    Route::get('/', 'FrontendController@domain');
});

只需确保此组是您的路由文件中的最后一个,它将充当域上的后备组,并为不匹配任何先前域的请求提供服务。

我还建议使用this package,它可能对您尝试做的事情有所帮助。

【讨论】:

    【解决方案2】:

    我自己在这里至少部分回答了这个问题:Creating a route in Laravel using subdomain and domain wildcards

    简而言之,您不能将整个域作为路由文件中的参数。相反,您分配一个中间件来检查当前域,将其与您预定义的允许用户域列表进行匹配,并基于此 - 做出一些决定(例如,在您的控制器中使用什么方法)。

    考虑:

    Route::group([
        'middleware' => 'domain-check',
    ], function () {
        Route::get('/', 'FrontendController@handle');
    });
    

    然后在你的 FrontendController 中:

    public function handle(Request $request)
    {
        // Information about the current user/domain is here
        $request->client;
    
        // An example - let's imagine that client object contains a view ID
        return response()->view($request->client->view);
    }
    

    【讨论】:

      【解决方案3】:

      很遗憾,我的评论没有得到答复。这个答案假设问题是使用正常的默认路由而不是带有子域的路由。

      例子:

      用户正在访问 sub.website.com,但 route() 返回的是 website.com/blabla 而不是 sub.website.com/blabla

      您可以通过在 routes.php 中为域动态创建模式来解决此问题

      // routes.php
      $url_parameters = @explode(".", $_SERVER['HTTP_HOST']);
      
      if (count($url_parameters) == 3)
      {
          $pattern = '{subdomain}.{domain}.{tld}';
      }
      else
      {
          $pattern = '{domain}.{tld}';
      }
      
      Route::group(['domain' => $pattern], function () {
      
          Route::get('/', [
              'as' => 'get_index',
              'uses' => 'HomeController@getIndex'
          ]);
      
      }
      

      通过使用这种方法,您的 route() 和控制器参数会产生问题。

      route() 问题

      在使用此方法时调用 route() 函数时,您将收到缺少参数的错误。 route() 函数要求您提供 {subdomain}.{domain}.{tld} 参数。

      您可以通过创建自己的路由函数来解决这个问题。我将其命名为 mdroute()(多域路由)。

      function mdroute($route, $parameters = [])
      {
      
          $data = [
              'domain' => \Request::route()->domain,
              'tld' => \Request::route()->tld
          ];
      
      
          $subdomain = \Request::route()->subdomain;
      
          if ($subdomain) $data['subdomain'] = $subdomain;
      
          // You can use mdroute('blabla', 'parameter')
          // or mdroute('blabla', ['par1' => 'parameter1', 'par2' => 'parameter2'])
          //
          if (is_array($parameters))
          {
              $data = array_merge($data, $parameters);
          }
          else
          {
              $data[] = $parameters;
          }
      
      
          return route($route, $data);
      
      }
      

      控制器问题

      参数 {sub}.{domain}.{tld} 始终发送到您的控制器。您无法像以前那样访问其他参数。

      例子:

      // Domain = sub.webite.com
      
      
      // Your route
      //
      Route::get('/post/{id}/{param2}', [
          'uses' => 'PostController@getIndex'
      ]);
      
      // PostController
      //
      public function getIndex($id, $param2)
      {
      
          // $id will be 'sub'
          // $param2 will be 'website'
      
      }
      

      您可以通过 Request 对象访问您的参数来解决此问题。

      public function getIndex(Request $request)
      {
      
          $id = $request->id;
      
          $param2 = $reqeust->param2;
      
      }
      

      【讨论】:

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