Laravel - CNAME + Subdomain Routing

后端 未结 3 1321
悲&欢浪女
悲&欢浪女 2021-02-11 06:44

I have my routes set up as follows:

 \'{username}.u.\'.env(\'APP_DOMAIN\'),
], function () {
    Route::get(\'/\', \         


        
3条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-11 07:07

    Unfortunately I did not get an answer to my comment. This answer assumes the problem is that normal default routes are used instead of routes with subdomain.

    Example:

    A user is visiting sub.website.com but route() returns website.com/blabla instead of sub.website.com/blabla

    You can solve this by dynamically create the pattern for domain inside 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'
        ]);
    
    }
    

    By using this method you will create a problem with your route() and controller parameters.

    route() problem

    When calling the route() function while using this method you will get a missing argument error. The route() function expects you to give the {subdomain}.{domain}.{tld} parameters.

    You can solve this by creating your own route function. I named it mdroute() (multi domain route).

    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);
    
    }
    

    Controller problem

    The parameters {sub}.{domain}.{tld} are always send to your controller. You can't access other parameters the way you are used to be.

    Example:

    // 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'
    
    }
    

    You can solve this by accessing your parameter through the Request object.

    public function getIndex(Request $request)
    {
    
        $id = $request->id;
    
        $param2 = $reqeust->param2;
    
    }
    

提交回复
热议问题