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 相关文章推荐
解析argc argv在php中的应用
Jun 24 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
php中session与cookie的比较
Jan 27 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
php面向对象程序设计入门教程
Jun 22 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 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使之能同时支持GIF和JPEG
2006/10/09 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
解析js如何获取css样式
2016/12/11 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
js实现省级联动(数据结构优化)
2020/07/17 Javascript
Python实现文件信息进行合并实例代码
2018/01/17 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
保送生自荐信范文
2015/03/26 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
导游词之广西漓江
2019/11/02 职场文书