我的路线安排如下:
<?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}作为完整的域名。
发布于 2016-05-27 08:10:35
不幸的是,我没有得到回应我的评论。这个答案假设问题是使用的是正常的默认路由,而不是带有子域的路由。
示例:
用户正在访问sub.website.com,但路由()返回website.com/blabla,而不是sub.website.com/blabla。
您可以通过在routes.php中动态创建域模式来解决这一问题。
// 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()(多域路由)。
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}总是发送给您的控制器。您不能以以前的方式访问其他参数。
示例:
// 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'
}您可以通过请求对象访问参数来解决这个问题。
public function getIndex(Request $request)
{
$id = $request->id;
$param2 = $reqeust->param2;
}发布于 2016-05-24 16:13:18
您不能在整个域上使用通配符,至少没有一个通配符。你能做的是:
Route::group([
'domain' => '{domain}.{suffix}',
], function () {
Route::get('/', 'FrontendController@domain');
});只需确保这个组是您的路由文件中的最后一个组,它将充当域上的后备组,并将服务于与以前的任何域不匹配的请求。
另外,我建议您使用这个包裹,这可能对您所要做的工作很有帮助。
发布于 2016-05-27 00:54:02
这一点至少部分地由我在这里回答:使用子域和域通配符在Laravel中创建路由
简而言之,不能使整个域成为路由文件中的参数。相反,您将分配一个中间件来检查当前域,将其与预先定义的允许用户域列表相匹配,并在此基础上做出一些决定(例如。在你的控制器中点击什么方法)。
考虑:
Route::group([
'middleware' => 'domain-check',
], function () {
Route::get('/', 'FrontendController@handle');
});然后在你的FrontendController中:
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);
}https://stackoverflow.com/questions/37360369
复制相似问题