资讯专栏INFORMATION COLUMN

Laravel 路由研究之domain 解决多域名问题

bladefury / 1395人阅读

摘要:关于路由中的在多域名下的说明首先,我们需要知道决定了路由会绑定到哪个控制器,还有一点需要注意,路由中的属性,决定了辅助函数生成的。

材料准备

一份干净的laravel

两份Nginx配置文件,主要配置如下:

</>复制代码

  1. server_name *.amor_laravel_test_1.amor;
  2. root /var/www/amor_laravel_test/public;
  3. index index.php index.html index.htm;

</>复制代码

  1. server_name *.amor_laravel_test.amor;
  2. root /var/www/amor_laravel_test/public;
  3. index index.php index.html index.htm;

将域名分割为参数

</>复制代码

  1. Route::domain("{account}.{webname}.{suffix}")->group(function () {
  2. Route::get("user/{id}", function ($account, $webname, $suffix, $id) {
  3. // 可以在请求中接收到被分割的参数,可能的使用场景:在多带带路由中需要根据不同的域名处理不同的需求
  4. dd($account, $webname, $suffix, $id);
  5. });
  6. });

注意: 若account不固定,可以将Nginx Server Name 配置为泛型: *.example.com

关于多域名

配置两个不同的域名如下:

server_name *.amor_laravel_test.amor;

server_name *.amor_laravel_test_1.amor;

如何让Laravel匹配不同的域名?

方式1:直接在 route/web.php中使用domain区分

</>复制代码

  1. Route::domain("{account}.amor_laravel_test.amor")->group(function () {
  2. Route::get("user/{id}", function ($account, $id) {
  3. //
  4. dd($account, $id);
  5. });
  6. });
  7. Route::domain("{account}.amor_laravel_test_1.amor")->group(function () {
  8. Route::get("user/{id}", function ($account, $id) {
  9. //
  10. dd(111, $account, $id);
  11. });
  12. });
方式2:通过设置 RouteServiceProvider 区分

添加方法:

</>复制代码

  1. protected function mapSelfRoutes()
  2. {
  3. Route::domain("{account}.amor_laravel_test_1.amor")
  4. ->middleware("web")
  5. ->namespace($this->namespace)
  6. ->group(base_path("routes/self.php"));
  7. }

注册

</>复制代码

  1. public function map()
  2. {
  3. $this->mapApiRoutes();
  4. $this->mapWebRoutes();
  5. $this->mapSelfRoutes();
  6. //
  7. }

添加路由文件

</>复制代码

  1. Route::get("/user", function ($account) {
  2. dd($account);
  3. });

注意: 必须全部设置domain,如果只设置了self 那么在相同请求路径下,未设置domain的将会首先匹配到。

关于路由中的Action在多域名下的说明

首先,我们需要知道Action决定了路由会绑定到哪个控制器,还有一点需要注意,路由中的Action属性,决定了辅助函数 route() 生成的url。
假如,我们的路由配置如下:

第一个路由

</>复制代码

  1. Route::get("/", function () {
  2. if(IlluminateSupportFacadesAuth::check()) {
  3. return redirect("index");
  4. } else {
  5. return redirect("login");
  6. }
  7. });

第二个路由

</>复制代码

  1. Route::get("/", function () {
  2. if(IlluminateSupportFacadesAuth::check()) {
  3. return redirect("index");
  4. } else {
  5. return redirect("login");
  6. }
  7. });

一模一样,都是调用内置的login路由,控制器也一样,我们再看模板中的form表单

</>复制代码

  1. ---

route() 辅助函数,会去读取路由 namelist 中加载的 login,如果我们在 RouteServiceProvider 中将这两个路由文件同时加载进来,

</>复制代码

  1. public function map()
  2. {
  3. $this->mapApiRoutes();
  4. $this->mapWebRoutes();
  5. $this->mapSelfRoutes();
  6. //
  7. }

那么:不区分namespace或者不区分控制器都会导致 route 辅助函数生成的绝对路径是最后一个路由domain,因此如果我们的逻辑一致,只是想通过简单的修改,通过不同的域名区别不同的站点,我们需要做判断,按需加载:

</>复制代码

  1. public function map()
  2. {
  3. if(request()->getHost() == env("ONLINEDOWN_DOMAIN")) {
  4. $this->mapApiRoutes();
  5. }
  6. if(request()->getHost() == env("PCSOFT_DOMAIN")) {
  7. $this->mapPcsoftRoutes();
  8. }
  9. $this->mapWebRoutes();
  10. //
  11. }
总结:

推荐第二种方式来区分域名,优点在于路由分离 ,结构清晰,

domain不仅仅可以作为区分子域名来使用,也可以做参数分割,不同域名区分等

注意Laravel的路由匹配顺序,希望大家能认真的做一遍,体验一下,做到心中有数

既然已经区分开域名,那么就可以绑定到不同的控制器,或者绑定不同的模型,大家灵活应用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31150.html

相关文章

  • Laravel 路由研究domain 解决域名问题

    摘要:关于路由中的在多域名下的说明首先,我们需要知道决定了路由会绑定到哪个控制器,还有一点需要注意,路由中的属性,决定了辅助函数生成的。 材料准备 一份干净的laravel 两份Nginx配置文件,主要配置如下: server_name *.amor_laravel_test_1.amor; root /var/www/amor_laravel_test/public; index in...

    baishancloud 评论0 收藏0
  • Laravel 域名下的字段验证

    摘要:所以我们需要进行如下的处理增加字段进行判重进行登录验证数据处理这个就不进行讨论了。注册判重判重依据我们知道使用后,默认使用登录,在表单验证中默认对进行判重。 前言 正在开发一个统一作者后台,用来让作者给网站提交软件。我们已经对其中一个网站开发了作者后台,现在我们打算将这一个后台提供给其他网站。它具备如下的一些特点: 我们访问的域名是不一致的,解决方案见我的一篇文章,Laravel 路...

    didikee 评论0 收藏0
  • 【日常填坑】ajax请求laravel的api接口

    摘要:合适和够用是最完美的追求。比如从页面去请求的资源。它允许浏览器向跨源服务器,发出请求,从而克服了只能同源使用的限制。定义在中的路由都是无状态的,并且会应用中间件组。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:http://www.linganm...

    Arno 评论0 收藏0
  • 【日常填坑】ajax请求laravel的api接口

    摘要:合适和够用是最完美的追求。比如从页面去请求的资源。它允许浏览器向跨源服务器,发出请求,从而克服了只能同源使用的限制。定义在中的路由都是无状态的,并且会应用中间件组。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:http://www.linganm...

    neu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<