任何域上的 Laravel 5 子域路由

Posted

技术标签:

【中文标题】任何域上的 Laravel 5 子域路由【英文标题】:Laravel 5 subdomain routing on any domain 【发布时间】:2015-10-01 07:37:07 【问题描述】:

在 laravel 5 应用程序中,我正在尝试为子域创建路由 不知道域。

Route::group(array('domain' => 'subdomain.domain.tld'), function() 
    Route::get('/', 'testController@getTest2');
);
Route::get('/', 'testController@getTest1');

这种路由有效,我得到 getTest2() 调用子域和 getTest1() 调用没有子域。

现在,我希望它与通配符域一起使用,但不向控制器发送参数, 因此开发环境中的应用程序可以在任何域上。 (我也考虑过使用 .env 来存储域,但是对于路由来说似乎太麻烦了)

我试过了

array('domain' => 'subdomain.domain.tld')

这需要控制器方法的参数。 我试过了

array('domain' => 'subdomain.domain?.tld?')

它不需要参数,但无论如何都会发送它们,所以我的实际路由参数会发生变化。

我也见过http://laravel-tricks.com/tricks/dynamic-subdomain-routing,但我不喜欢在过滤器中处理我的域的想法。

有没有其他方法可以让通配符域在处理路由组后被忽略?

【问题讨论】:

我对此也很感兴趣。我的 laravel 后端提供了一个 api,我对其进行了配置,以便该 api 在 api.domain 下可用,以及在不同子域下与 oauth 相关的其他一些东西。由于我正在使用宅基地进行本地开发,并且服务器显然将在另一个域上,我希望有一种方法可以不在我的应用程序中对域进行硬编码 在找到更好的解决方案之前,我已经直接在路由文件中添加了手动域检查,使用类似于用户 mazon 在这里回答的内容:***.com/a/12372310/2099306 【参考方案1】:

我发现最好的方法是创建一个中间件,从您的路由中删除特定参数。例如,在您的情况下:

class Subdomain 
  public function handle($request, Closure $next) 
  
    $route = $request->route();
    $domain = $route->parameter('domain');
    $tld = $route->parameter('tld');

    //do something with your params

    $route->forgetParameter('domain');
    $route->forgetParameter('tld');
    return $next($request);
  


//inside your Kernel.php, make sure to register the middleware
protected $routeMiddleware = [
  'subdomain' => \App\Http\Middleware\Subdomain::class,
];

Route::group(['middleware' => 'subdomain', 'domain' => 'subdomain.domain.tld'], function () 
  Route::get('/', function () 
    dd(func_get_args()); //no args, because it was removed in the middleware
  );
);

【讨论】:

有趣的方法。我喜欢它,并且可能会用它来操作路由中的参数。但是,它并不能解决问题。这样,“/”的路由功能对于所有子域仍然是相同的。这个想法是根据调用的子域指向不同的函数。 x.sub.tld > 函数 1,y.sub.tld > 函数 2。不过谢谢你的新想法。【参考方案2】:

让你知道你可以做到

'domain' => 'subdomain.domain.tld' 

这会将 a.domain.com 和 b.domain.com 路由到所有相同的路由/相同的控制器,您可以在该控制器内执行您的逻辑。

我会使用上面建议的中间件从请求中删除域和 tld,否则每个建模都必须看起来像。

public function myMethod($subdomain, $domain, $tld, $id)

假设您的路由需要 $id 或任何其他路由参数。

您可能感兴趣的另一件事是显式表单模型绑定。

【讨论】:

【参考方案3】:

检查这可能有助于回答您的问题:

http://laravel.com/docs/5.1/routing#parameters-regular-expression-constraints

http://laravel.com/docs/5.1/routing#route-group-sub-domain-routing

【讨论】:

我已经阅读了文档,参数中的正则表达式会影响参数,但不会改变控制器获取它们的方式。

以上是关于任何域上的 Laravel 5 子域路由的主要内容,如果未能解决你的问题,请参考以下文章

将任何子域重定向到主域上的页面

Laravel 5,子域路由,带可选参数

Laravel 5.4 通过子域运行所有路由

子域路由在 Laravel 5 上不起作用 - WAMPServer

使用 Laravel 进行子域路由

Laravel 5 中间件路由群组子域名路由