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安装全攻略:APACHE
Oct 09 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
PHP实现邮件群发的源码
Jun 18 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
初识php MVC
2014/09/10 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
纯js实现画一棵树的示例
2017/09/05 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
python实现的udp协议Server和Client代码实例
2014/06/04 Python
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python编写微信公众号首图思路详解
2019/12/13 Python
python 字典套字典或列表的示例
2019/12/16 Python
python实现FTP循环上传文件
2020/03/20 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
财务部总监岗位职责
2014/03/12 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
python 使用pandas读取csv文件的方法
2022/12/24 Python