首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel +子域路由

Laravel +子域路由
EN

Stack Overflow用户
提问于 2016-05-21 07:56:25
回答 3查看 2.9K关注 0票数 2

我的路线安排如下:

代码语言:javascript
复制
<?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->pattern('domain', '[a-z0-9.]+');,允许{domain}作为完整的域名。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-27 08:10:35

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

示例:

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

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

代码语言:javascript
复制
// 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'
    ]);

}

通过使用此方法,您将创建路由()和控制器参数的问题。

路由()问题

在使用此方法调用will ()函数时,您将得到一个丢失的参数错误。route()函数要求您提供{子域}.{domain}.{tld}参数。

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

代码语言:javascript
复制
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}总是发送给您的控制器。您不能以以前的方式访问其他参数。

示例:

代码语言:javascript
复制
// 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'

}

您可以通过请求对象访问参数来解决这个问题。

代码语言:javascript
复制
public function getIndex(Request $request)
{

    $id = $request->id;

    $param2 = $reqeust->param2;

}
票数 3
EN

Stack Overflow用户

发布于 2016-05-24 16:13:18

您不能在整个域上使用通配符,至少没有一个通配符。你能做的是:

代码语言:javascript
复制
Route::group([
    'domain' => '{domain}.{suffix}',
], function () {
    Route::get('/', 'FrontendController@domain');
});

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

另外,我建议您使用这个包裹,这可能对您所要做的工作很有帮助。

票数 0
EN

Stack Overflow用户

发布于 2016-05-27 00:54:02

这一点至少部分地由我在这里回答:使用子域和域通配符在Laravel中创建路由

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

考虑:

代码语言:javascript
复制
Route::group([
    'middleware' => 'domain-check',
], function () {
    Route::get('/', 'FrontendController@handle');
});

然后在你的FrontendController中:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37360369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档