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 相关文章推荐
《APMServ 5.1.2》使用图解
Oct 23 PHP
PHP 页面编码声明方法详解(header或meta)
Mar 12 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PDO::quote讲解
Jan 29 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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之PHP语法学习笔记1
2006/12/17 PHP
PHP print类函数使用总结
2010/06/25 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
Python基础知识点 初识Python.md
2019/05/14 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
基于python检查矩阵计算结果
2020/05/21 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
浅析python实现动态规划背包问题
2020/12/31 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
农业开发项目建议书
2014/05/16 职场文书
物理教育专业求职信
2014/06/25 职场文书
2014年环保工作总结
2014/11/26 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
行政介绍信范文
2015/05/04 职场文书
找规律教学反思
2016/02/23 职场文书
SQL Server中搜索特定的对象
2022/05/25 SQL Server