【问题标题】:Laravel Route to multi domainLaravel 路由到多域
【发布时间】:2014-05-14 16:01:00
【问题描述】:

我正在创建一个平台来支持平台下的多个网站,有些网站需要有不同的域。

最常见的是使用同一个域:

myrootdomain.com/first_product/profile

myrootdomain.com/second_product/profile

在这些情况下,{first_product} 和 {second_product} 将作为参数传递给几乎所有函数。 /first_product 和 /second_product 是在同一平台下运行的完全不同的网站。

但我需要创建另一个产品,我可以在其中更改 TLD 并且仍然能够将 {anotherrootdomain} 标识为我的函数的第一个参数。像这样的:

anotherrootdomain.com/profile

我已经在使用 Route::bind 处理第一个参数。

<?php

Route::bind('short_url', function($value, $route)
{
    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

Route::get('/{short_url}/login', 'HomeController@login');
Route::get('/{short_url}/profile', 'UserController@profile');

现在我不知道该怎么做:

1) 寻找域名

2) 使用域作为第一个参数

我知道我的英语很糟糕,但我希望你能帮助我!


编辑:

我可以在 routes.php 上做这样的事情:

if($_SERVER['HTTP_HOST'] == "anotherrootdomain.com")
    $tld = "anotherrootdomain";

那么我需要借此机会:

Route::get('/{short_url}/login', 'HomeController@login');
Route::get('/{short_url}/profile', 'UserController@profile');

到这里:

Route::get('/login', 'HomeController@login');
Route::get('/profile', 'UserController@profile');

我可以使用一个简单的 if 来做到这一点,但现在我无法在我的路由上传递参数! HomeController@login 需要一个参数,我需要传递 $tld 变量,但我不知道如何!

【问题讨论】:

  • 其实你的英文还不错。
  • 谢谢@bjb568,我犯了一些错误,但最重要的是传递信息! :)
  • 也许您正在寻找sub-domain 解决方案?
  • 我认为这是不同的,@SheikhHeera。我想要一个新的顶级域,而不仅仅是一个子域。
  • 所有顶级域都可以访问同一个laravel系统文件夹吗?这些路由是否定义在同一个路由文件中?

标签: php laravel laravel-routing


【解决方案1】:

我想出了一个办法!

假设我在示例中的 /second_product 需要可以使用另一个 TLD 访问,例如“awesomeproduct.com”。一些 URL 需要机会:

myrootdomain.com/second_product/login => awesomeproduct.com/login

myrootdomain.com/second_product/profile => awesomeproduct.com/profile

虽然 first_product 仍然只是以第一种方式工作:

myrootdomain.com/first_product/login

myrootdomain.com/first_product/profile

为了使它成为可能,我创建了一个带有子域的路由组(我不知道我也可以在 TLD 上使用通配符):

Route::group(array('domain' => '{short_url}.com'), function($short_url)

我稍微更改了 Route::bind 以更改 {short_url} 参数:

Route::bind('short_url', function($value, $route)
{
    if($value == "awesomeproduct")
        $value = "second_product";

    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

最后,我需要更改路线以使用或不使用 {short_url}:

$tld = "";
if($_SERVER['HTTP_HOST'] != "testefacop.com")
    $tld = "{short_url}/";

Route::get('/'.$tld.'login', 'HomeController@login');
Route::get('/'.$tld.'profile', 'UserController@profile');

这是我完整的 routes.php:

<?php

Route::bind('short_url', function($value, $route)
{
    if($value == "awesomeproduct")
        $value = "second_product";

    $product = Product::where('short_url', $value)->first();

    if(is_null($product))
        return false;
    return $product->id;
});

Route::group(array('domain' => '{short_url}.com'), function($short_url)
{
    $tld = "";
    if($_SERVER['HTTP_HOST'] != "awesomeproduct.com")
        $tld = "{short_url}/";

    Route::get('/'.$tld.'login', 'HomeController@login');
    Route::get('/'.$tld.'profile', 'UserController@profile');

}

这不是一个伟大而完美的解决方案,但它按预期工作!

【讨论】:

  • 很高兴你解决了它:) 这几乎就是我在评论中的想法(事实上你做得更好,我的想法是为两种不同的情况设置两个路线组)。如果它解决了问题顺便说一句,您可能应该将您的答案标记为已接受。我知道自我推销,但有时就是这样!
  • 感谢@alexrussell,您的评论让我大开眼界,找到了解决方案!
猜你喜欢
  • 2021-02-08
  • 2020-01-04
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2016-09-18
  • 2016-09-25
  • 2015-09-10
相关资源
最近更新 更多