我希望能够在我的应用程序中为不同的域使用不同的路由。我想根据域名是否
采取不同的行动mysite.com/something
subdomain.mysite.com/something
anotherdomain.com
我接近这样的问题:
// Match my own domain
Route::group(['domain' => 'mysite.com'], function()
{
Route::any('/', function()
{
return 'My own domain';
});
});
// Match a subdomain of my domain
Route::group(['domain' => '{subdomain}.mysite.com'], function()
{
Route::any('/', function($subdomain)
{
return 'Subdomain ' . $subdomain;
});
});
// Match any other domains
Route::group(['domain' => '{domain}'], function()
{
Route::any('/', function()
{
return 'Full domain ';// . $domain;
});
});
前两组完美无缺。访问mysite.com
会显示My own domain
并按预期显示subdomain.mysite.com
Subdomain subdomain
。但是,当我访问anotherdomain.com
时(我将此设置为我的vhost文件中的别名以及将其指向我的hosts文件中的环回IP),我得到NotFoundHttpException
:
/var/www/portfolio/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php
代码:
$others = $this->checkForAlternateVerbs($request);
if (count($others) > 0)
{
return $this->getOtherMethodsRoute($request, $others);
}
throw new NotFoundHttpException;
}
我是否有办法以这种方式匹配任何不属于我的域名或域名子域名的域名?我之后也需要能够访问域以对其执行某些操作,就像我使用$subdomain
一样。
谢谢, 乔纳森
答案 0 :(得分:7)
也在寻找这个......
可能不是最漂亮的解决方案,但它有效
// Match my own domain
Route::group(['domain' => 'mysite.com'], function()
{
Route::any('/', function()
{
return 'My own domain';
});
});
// Match a subdomain of my domain
Route::group(['domain' => '{subdomain}.mysite.com'], function()
{
Route::any('/', function($subdomain)
{
return 'Subdomain ' . $subdomain;
});
});
// Match any other domains
Route::group(['domain' => '{domain}.{tld}'], function(){
Route::any('/', function($domain, $tld){
return 'Domain: ' . $domain . '.' . $tld;
});
});
Route::group(['domain' => '{subdomain}.{domain}.{tld}'], function(){
Route::any('/', function($sub, $domain, $tld){
return 'subdomain: ' . $sub . '.' . $domain . '.' . $tld;
});
});
顺便说一句,如果您想测试它,请将一些假域添加到您的HOSTS文件中,并将它们指向127.0.0.1: - )
答案 1 :(得分:0)
答案 2 :(得分:0)
这是一个迟到的响应,但您可以执行动态完整域路由,而无需使用丑陋的扩展黑客。默认情况下,Laravel域过滤器应用正则表达式,以防止您在传递给过滤器的值中使用句点字符。因此,当你将它分解成段时,为什么它会起作用,但如果你试图将整个域作为单个参数传递则不行。
最简单的解决方案是在boot
文件的app/Providers/RouteServiceProvider.php
方法中修改应用于域过滤器的模式,如下所示:
public function boot(Router $router)
{
$router->pattern('domain', '[a-z0-9.]+');
parent::boot($router);
}
这将允许您通过过滤器发送完整的域名。
答案 3 :(得分:-1)
看起来这个问题已经过时了。但是,您可以使用以下内容:
只需从代码中删除组部分,因为这将适用于任何其他域
Route::any('/', function()
{
return 'Full domain ';// . $domain;
});