带有通配符的多个域的Laravel路由组,如何处理域后缀?

Posted

技术标签:

【中文标题】带有通配符的多个域的Laravel路由组,如何处理域后缀?【英文标题】:Laravel routing group for muliple domains with wildcards, how to handle domain suffixes? 【发布时间】:2015-02-24 23:55:26 【问题描述】:

我有 3 个域,在我的本地服务器上采用以下格式:

mydomainfirst.local mydomainsecond.local mydomainthird.local

在我的 routes.php 文件中,我有以下内容:

Route::group(array('domain' => 'domain.suffix'), function() 

    Route::get('/', 'Primary@initialize');

);

想法是在我的控制器中获取$domain 变量并从中提取第一/第二/第三部分,这很好。但是,现在我的网站上线了,这个路由文件不再起作用并抛出 Http-not-found 异常。过了一会儿,我发现问题在于域现在采用了mydomainfirst.co.uk 的格式。因为域后缀现在有 2 个部分,看来我需要这样做:

Route::group(array('domain' => 'domain.a.b'), function() 

    Route::get('/', 'Primary@initialize');

);

让它工作。这是愚蠢的。我怎么能告诉它只接受任何后缀?我可以使用“任何”通配符吗?

我尝试了一些类似this answer 的方法,但它不适用于路由组。

编辑:看来Enhanced Router 包至少可以让我在路由组中添加where 子句,但它是否解决了如何设置通配符的问题匹配不确定数量的段?我需要类似的东西:

domain.anything

这将匹配两者:

mydomainfirst.local AND mydomainfirst.co.uk

?

【问题讨论】:

看起来this package 可以帮助您解决问题 @lukasgeiter 谢谢,请查看编辑。 ->where('anything', '.*') 可以试试吗? 很遗憾,我什至无法安装此软件包。看起来它与最新的 Laravel 路由不兼容?截图:tinyurl.com/qdllvuo 是的,它在 github 上有一些未解决的问题,而且它似乎与 Laravel 4.2 不兼容。你可以试试this fork 【参考方案1】:

好的,我先说this package 的代码实际上看起来不错并且应该可以工作。即使您无法通过安装来运行它,您也可以获取文件并将代码与您自己的服务提供商等一起使用。

但也有一种快速而肮脏的解决方案。 (实际上这个包做起来很相似,但是看起来好多了;))

首先,这是一条路线的方法:

Route::group(array('domain' => 'domain.tld'), function()
    Route::get('/', 'Primary@initialize')->where('tld', '.*');
);

所以路由组的 where 条件实际上是在单个路由上设置的。

当然,您不想为该组内的每条路由都执行此操作,因此您可以使用简单的 foreach 循环:

Route::group(array('domain' => 'domain.tld'), function($group)

    Route::get('/', 'Primary@initialize');

    foreach($group->getRoutes() as $route)
        $route->where('tld', '.*');
    
);

注意:循环需要在所有路由之后。否则他们不会注册,因此不会返回getRoutes()

【讨论】:

这绝对是绝妙的,就像一个魅力。非常感谢!

以上是关于带有通配符的多个域的Laravel路由组,如何处理域后缀?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理带有角度 2 参数的子路由?

如何处理多个 Enumerable.Zip 调用?

reactjs 如何处理一个组件中的多个单选按钮组?

XCode 如何处理带有多个目标的#import 标头语句?

Mysql如何处理包含多个项目的单行

如何处理 Django 中不共享同一个域的前端