Laravel路由研究之domain解决多域名问题的方法示例


Posted in PHP onApril 04, 2019

材料准备

一份干净的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的将会首先匹配到。

关于路由中的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表单

<form method="POST" class="form-horizontal" action="{{ route('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 相关文章推荐
PHP伪静态页面函数附使用方法
Jun 20 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php类常量的使用详解
Jun 08 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
非常重要的php正则表达式详解
Jan 04 PHP
详解PHP归并排序的实现
Oct 18 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
php7 新增功能实例总结
May 25 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 #PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 #PHP
PHP whois查询类定义与用法示例
Apr 03 #PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 #PHP
PHP反射实际应用示例
Apr 03 #PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 #PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 #PHP
You might like
php intval的测试代码发现问题
2008/07/27 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
javascript 计算两个整数的百分比值
2009/12/26 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
three.js实现圆柱体
2018/12/30 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python类的实例化问题解决
2019/08/31 Python
pytorch 常用线性函数详解
2020/01/15 Python
如何提高python 中for循环的效率
2020/04/15 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
社团活动总结
2014/04/28 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技