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 删除数组元素
Jan 16 PHP
php中取得文件的后缀名?
Feb 20 PHP
基于php无限分类的深入理解
Jun 02 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
PHP构造二叉树算法示例
Jun 21 PHP
关于php开启错误提示的总结
Sep 24 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 中文乱码解决办法总结分析
2009/07/30 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
Python 字典与字符串的互转实例
2017/01/13 Python
Django自定义分页效果
2017/06/27 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
python内置数据类型之列表操作
2018/11/12 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
同学会邀请书大全
2014/01/12 职场文书
校园安全演讲稿
2014/05/09 职场文书
社会实践活动总结范文
2014/07/03 职场文书
倡议书的写法
2014/08/30 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL