如何在Laravel中自动创建子域

时间:2019-10-27 23:19:14

标签: php laravel laravel-5 laravel-5.8

我正在使用Laravel创建一个SaaS应用,并且正在尝试为每个用户注册创建子域。例如,

  1. 用户来到www.somewebsite.com并注册
  2. 在注册期间,用户提供其商户名称,例如mybiz
  3. 我希望我的Laravel应用程序动态创建动态子域mybiz.somewebsite.com
  4. 每当用户登录网站时,他们就会自动重定向到mybiz.somewebsite.com,并在整个会话期间都停留在该URL上。

作为管理员,我从来都不想手动创建一个子域。我在Ubuntu上使用Apache进行Laravel安装。

2 个答案:

答案 0 :(得分:0)

首先在服务器上创建一个通配符子域,以便您的laravel应用处理所有子域请求。然后为您的应用程序创建一个全局中间件,该中间件从请求URL中提取子域并进行适当处理。这样,https://example.com和https:// {username} .example.com都将由您的应用程序处理,您可以使用{username}

做您想做的事情

答案 1 :(得分:0)

执行此操作的方法很多,很大程度上取决于您要在此处实现的目标。

我假设您不想动态创建并提供真实的主机名/子域,因此我将创建指向该计算机的通配符DNS记录。指向IP地址的单个A记录即可解决问题,只需在前面添加星号"*"而不是指定主机名。

然后,域记录将如下所示:

┌──────────────────────────────┬─────────────┬──────────────────────────────────┐
│    HOSTNAME                  │    TYPE     │    POINT TO                      │
│──────────────────────────────│─────────────│──────────────────────────────────│
│    some-domain.com           │      A      │    SERVER IP ADDRESS             │
│    *.some-domain.com         │      A      │    SERVER IP ADDRESS             │
│    wwww.some-domain.com      │    CNAME    │    some-domain.com               │

这样,您基本上会将所有流量从主机名的任何变体重定向到单个地址,并对其进行管理。像这样的通配符记录只能被另一个更特定的记录覆盖,因此它将标识为whatever.some-domain.comanything.some-domain.com,并允许您虚拟地完全管理它,而无需添加任何其他记录。

现在,您要告诉Web服务器控制所有可能的地址。使用Apache,您可以通过添加任意数量的虚拟主机来进行配置,也可以只添加一个通用主机,然后将所有路由路由到Laravel应用程序,然后由其自己处理。这样的事情会起作用:

 <VirtualHost *:80>
   ServerName your-domain.com
   ServerAlias *.your-domain.com
   DocumentRoot /var/www/laravel/app
 </VirtualHost>

这时您可以做任何您想做的事情-因为您可以处理所有可以将访问者路由到任何子域的流量。您可以在Apache中设置一些环境变量,以确切知道有人访问该应用程序时使用了哪个子域,或者使用PHP内置函数并使用$_SERVER['HTTP_HOST']之类的全局变量读取地址。

我确信Laravel提供了足够多的实用程序来处理所有现成的东西,但是不需要依赖框架,即使使用这样的伪代码,也可以完成流量的处理:

<?php
if ($_SERVER['HTTP_HOST'] !== CurrentUser::get_personal_subdomain()) {
  http_response_code(301);
  header('Location: '. Router::random_address());
  exit;
}