当前位置: 首页 > 后端技术 > PHP

Laravel路由研究的domain解决多域名问题

时间:2023-03-29 15:11:51 PHP

材料准备一个干净的laravel,有两个Nginx配置文件,主要配置如下:server_name*.amor_laravel_test_1.amor;root/var/www/amor_laravel_test/public;indexindex.phpindex.htmlindex.htm;server_name*.amor_laravel_test.amor;root/var/www/amor_laravel_test/public;indexindex.phpindex.htmlindex.htm;将域名拆分成参数Route::domain('{account}.{webname}.{suffix}')->group(function(){Route::get('user/{id}',function($account,$webname,$suffix,$id){//可以在请求中接收split参数,可能的使用场景:在单独的路由中,需要根据不同的域名处理不同的需求dd($account,$webname,$suffix,$id);});});注意:如果账号不固定,可以配置NginxServerName为generic:*.example.com多个域名配置两个不同的域名如下:server_name*.amor_laravel_test.amor;server_name*.amor_laravel_test_1.amor;如何让Laravel匹配不同的域名?方法一:在route/web.php中直接使用domain来区分Route::domain('{account}.amor_laravel_test.amor')->group(function(){Route::get('user/{id}',function($account,$id){//dd($account,$id);});});Route::domain('{account}.amor_laravel_test_1.amor')->group(function(){Route::get('user/{id}',function($account,$id){//dd(111,$account,$id);});});方法二:通过设置RouteServiceProvider来区分添加方法:->group(base_path('routes/self.php'));}注册公共函数map(){$this->mapApiRoutes();$this->mapWebRoutes();$this->mapSelfRoutes();//}添加路由文件Route::get('/user',function($account){dd($account);});注意:必须设置所有的domain,如果只设置self,那么在同一个请求路径下,如果没有设置domain,会先匹配多个域名下route中Action的描述。首先,我们要知道Action决定了路由会绑定到哪个controller。另外需要注意的是路由中的Action属性,决定了辅助函数route()生成的url。假设,我们的路由配置如下:第一条路由Route::get('/',function(){if(\Illuminate\Support\Facades\Auth::check()){returnredirect('index');}else{returnredirect('login');}});第二条路线Route::get('/',function(){if(\Illuminate\Support\Facades\Auth::check()){returnredirect('index');}else{returnredirect('login');}});一模一样,都是调用内置的登录路由,controller也是一样的,我们看模板中的form表单---route()辅助函数会读取routenamelist中加载的login,如果我们在RouteServiceProvider中同时加载这两个路由文件,publicfunctionmap(){$this->mapApiRoutes();$this->mapWebRoutes();$this->mapSelfRoutes();//}then:不区分Namespace或者不区分controller都会导致路由辅助函数生成的绝对路径是最后一个路由域。所以,如果我们的逻辑是一致的,我们只是想通过简单的修改,通过不同的域名来区分不同的站点。我们需要做判断,按需要加载:publicfunctionmap(){if(request()->getHost()==env('ONLINEDOWN_DOMAIN')){$this->mapApiRoutes();}if(request()->getHost()==env('PCSOFT_DOMAIN')){$this->mapPcsoftRoutes();$this->mapWebRoutes();//}总结:推荐使用第二种方法来区分域名。优点在于路线分离,结构清晰。domain不仅可以作为区分子域名,还可以用于参数切分,不同域名区分等。注意Laravel的路由匹配顺序。希望大家认真去做,体验一下,做到心知肚明。既然已经区分了域名,那么就可以进行绑定了。针对不同的控制器,或者绑定不同的模型,大家可以灵活应用