使用子域和域通配符在Laravel中创建路由

时间:2016-05-17 21:58:44

标签: php laravel routing

使用Laravel 5.2,我想设置一个通配符子域组,以便我可以捕获一个参数。我试过这个:

Route::group(['middleware' => ['header', 'web']], function () {
    Route::group(['domain' => '{alias}.'], function () {
       Route::get('alias', function($alias){
            return 'Alias=' . $alias;
        });
    });
});

我也试过['domain' => '{alias}.*']

我正在调用此URL:http://abc.localhost:8000/alias并返回错误的路径未找到。

使用localhost:8000命令,我的本地环境为php artisan serve。是否可以在没有与之关联的实际域名的情况下在本地进行设置?

2 个答案:

答案 0 :(得分:1)

在第2行:

Route::group(['domain' => '{alias}.'], function() {

将其替换为以下内容:

Route::group(['domain' => '{alias}.localhost'], function() {

之后它应该可以工作。

答案 1 :(得分:1)

我之前有过类似的任务。如果你想捕获任何域,任何格式 - 遗憾的是你不能直接在routes文件中。路由文件期望URL的至少一部分是预定义的,静态的。

我最终做的是创建一个中间件来解析域URL并根据它做一些逻辑,例如:

class DomainCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $domain = parse_url($request->url(), PHP_URL_HOST);

        // Remove www prefix if necessary
        if (strpos($domain, 'www.') === 0) $domain = substr($domain, 4);

        // In my case, I had a list of pre-defined, supported domains
        foreach(Config::get('app.clients') as $client) {
            if (in_array($domain, $client['domains'])) {
                // From now on, every controller will be able to access
                // current domain and its settings via $request object
                $request->client = $client;
                return $next($request);
            }
        }

        abort(404);
    }
}