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继承的一个应用
Sep 06 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
测试php函数的方法
Nov 13 PHP
php的XML文件解释类应用实例
Sep 22 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
php简单实现快速排序的方法
Apr 04 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP中cookie知识点学习
May 06 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中执行系统外部命令
2006/10/09 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
php不写闭合标签的好处
2014/03/04 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
js的各种数据类型判断的介绍
2019/01/19 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
Python中return语句用法实例分析
2015/08/04 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
如何基于python实现归一化处理
2020/01/20 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
python 实现音频叠加的示例
2020/10/29 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
灵泰克Java笔试题
2016/01/09 面试题
团日活动总结
2014/04/28 职场文书
2014年母亲节寄语
2014/05/07 职场文书
慰问信模板
2015/02/14 职场文书
毕业生个人自荐书
2015/03/05 职场文书
天那边观后感
2015/06/09 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python