【问题标题】:How to create a subdomain automatically in Laravel如何在 Laravel 中自动创建子域
【发布时间】:2019-10-27 23:19:14
【问题描述】:

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

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

作为管理员,我绝不想手动创建子域。我在 Ubuntu 上使用 Apache 来安装 Laravel。

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.8


    【解决方案1】:

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

    【讨论】:

    • 对此进行扩展,您还必须使用指向您的服务器并拥有通配符 SSL 证书的 DNS 提供商设置通配符子域 *.example.com,并设置您的 Apache 配置来处理此问题.
    【解决方案2】:

    有很多方法可以做到这一点,很大程度上取决于您在这里要达到的目标。

    我假设您不想动态创建和放弃真实的主机名/子域,所以我会创建指向机器的通配符 DNS 记录。单个指向 IP 地址的记录就可以解决问题,只需在前面添加星号 "*" 而不是指定主机名。

    域记录将如下所示:

    ┌──────────────────────────────┬─────────────┬──────────────────────────────────┐
    │    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,并允许您以虚拟方式对其进行全面管理,而无需添加更多记录。

    现在您想告诉您的网络服务器控制所有这些可能的地址。使用 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;
    }
    

    【讨论】:

    • 基本上,我希望在他们的域名下发生与该用户相关的任何事情。该用户的所有内容创建/编辑/删除应该只对他/她自己的域下的用户可见,即 mybiz.somewebsite.com 。例如,如果 mybiz 所有者创建了一个名为 about-us 的页面 - 它仅显示在 mybiz.somewebsite.com/about-us 下,并且如果 yourbiz 所有者还创建了一个名为 about-us 的页面,该页面显示在 yourbiz.somewebsite.com/ 下about-us 和每个只能由 mybiz 或 yourbiz 子域授权的用户查看。
    • 您可以使用通配符子域完全做到这一点,它只需要一条 DNS 记录并在 Apache 配置中添加虚拟主机。之后,您可以完全按照此处文档中的说明使用 Laravel 路由:laravel.com/docs/5.8/routing#route-group-sub-domain-routing
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2011-08-14
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多