详解Laravel路由之domain解决多域名问题

发布时间 - 2021-03-30 00:00:00    点击率:

下面由laravel教程栏目给大家介绍laravel 路由研究之domain 解决多域名问题,希望对需要的朋友有所帮助!

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

材料准备

  • 一份干净的laravel
  • 两份Nginx配置文件,主要配置如下:

    server_name *.amor_laravel_test_1.amor;
    root /var/www/amor_laravel_test/public;
    index index.php index.html index.htm;
    server_name *.amor_laravel_test.amor;
    root /var/www/amor_laravel_test/public;
    index index.php index.html index.htm;

将域名分割为参数

Route::domain('{account}.{webname}.{suffix}')->group(function () {

    Route::get('user/{id}', function ($account, $webname, $suffix, $id) {
        // 可以在请求中接收到被分割的参数,可能的使用场景:在单独路由中需要根据不同的域名处理不同的需求

        dd($account, $webname, $suffix, $id);

    });
});

注意: 若account不固定,可以将Nginx Server Name 配置为泛型: *.example.com

关于多域名

配置两个不同的域名如下:

  1. server_name *.amor_laravel_test.amor;
  2. server_name *.amor_laravel_test_1.amor;

如何让Laravel匹配不同的域名?

方式1:直接在 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);

    });
});

方式2:通过设置 RouteServiceProvider 区分

  • 添加方法:
    protected function mapSelfRoutes()
    {
        Route::domain('{account}.amor_laravel_test_1.amor')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/self.php'));
    }
  • 注册
    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        $this->mapSelfRoutes();

        //
    }
  • 添加路由文件
Route::get('/user', function ($account) {
    dd($account);
});

注意: 必须全部设置domain,如果只设置了self 那么在相同请求路径下,未设置domain的将会首先匹配到。

【推荐:最新的五个Laravel视频教程】

关于路由中的Action在多域名下的说明

首先,我们需要知道Action决定了路由会绑定到哪个控制器,还有一点需要注意,路由中的Action属性,决定了辅助函数 route() 生成的url。
假如,我们的路由配置如下:

  • 第一个路由

    Route::get('/', function () {
        if(\Illuminate\Support\Facades\Auth::check()) {
            return redirect('index');
        } else {
            return redirect('login');
        }
    });
  • 第二个路由

    Route::get('/', function () {
        if(\Illuminate\Support\Facades\Auth::check()) {
            return redirect('index');
        } else {
            return redirect('login');
        }
    });

一模一样,都是调用内置的login路由,控制器也一样,我们再看模板中的form表单

---

route() 辅助函数,会去读取路由 namelist 中加载的 login,如果我们在 RouteServiceProvider 中将这两个路由文件同时加载进来,

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    $this->mapSelfRoutes();

    //
}

那么:不区分namespace或者不区分控制器都会导致 route 辅助函数生成的绝对路径是最后一个路由domain,因此如果我们的逻辑一致,只是想通过简单的修改,通过不同的域名区别不同的站点,我们需要做判断,按需加载:

public function map()
{
    if(request()->getHost() == env('ONLINEDOWN_DOMAIN')) {
        $this->mapApiRoutes();
    }

    if(request()->getHost() == env('PCSOFT_DOMAIN')) {
        $this->mapPcsoftRoutes();
    }

    $this->mapWebRoutes();
    //
}

总结:

1.推荐第二种方式来区分域名,优点在于路由分离 ,结构清晰,
2.domain不仅仅可以作为区分子域名来使用,也可以做参数分割,不同域名区分等
3.注意Laravel的路由匹配顺序,希望大家能认真的做一遍,体验一下,做到心中有数
4.既然已经区分开域名,那么就可以绑定到不同的控制器,或者绑定不同的模型,大家灵活应用


# php  # laravel  # nginx  # 绑定  # 加载  # 都是  # 决定了  # 第一个  # 将会  # 一遍  # 心中有数  # 这两个  # 第二个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 大连 网站制作,大连天途有线官网?  黑客如何通过漏洞一步步攻陷网站服务器?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  php结合redis实现高并发下的抢购、秒杀功能的实例  Android自定义listview布局实现上拉加载下拉刷新功能  如何实现建站之星域名转发设置?  Laravel如何实现一对一模型关联?(Eloquent示例)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在万网自助建站平台快速创建网站?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  深圳网站制作平台,深圳市做网站好的公司有哪些?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  独立制作一个网站多少钱,建立网站需要花多少钱?  利用vue写todolist单页应用  Python结构化数据采集_字段抽取解析【教程】  浅谈Javascript中的Label语句  Python函数文档自动校验_规范解析【教程】  浅谈javascript alert和confirm的美化  怎么用AI帮你为初创公司进行市场定位分析?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在 React 中条件性地遍历数组并渲染元素  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  用yum安装MySQLdb模块的步骤方法  微信小程序 HTTPS报错整理常见问题及解决方案  如何快速搭建高效WAP手机网站?  如何基于PHP生成高效IDC网络公司建站源码?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  中山网站制作网页,中山新生登记系统登记流程?  高端建站如何打造兼具美学与转化的品牌官网?  Laravel如何创建自定义Facades?(详细步骤)  Laravel怎么使用Intervention Image库处理图片上传和缩放  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何快速生成ASP一键建站模板并优化安全性?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何用狗爹虚拟主机快速搭建网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?