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创建动态图像
Oct 09 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
php生成图形验证码几种方法小结
Aug 15 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
php简单实现快速排序的方法
Apr 04 PHP
php成功操作redis cluster集群的实例教程
Jan 13 PHP
PHP token验证生成原理实例分析
Jun 05 PHP
Yii框架函数简单用法分析
Sep 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 删除cookie和浏览器重定向
2009/03/16 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
PHP的全局错误处理详解
2016/04/25 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
javascript 文档的编码问题解决
2009/03/01 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python随手笔记之标准类型内建函数
2015/12/02 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python内打印变量之%和f的实例
2020/02/19 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
酒店公关部经理岗位职责
2013/11/24 职场文书
军训拉歌口号
2014/06/13 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
银行工作心得体会范文
2016/01/23 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS