【问题标题】:PHP Laravel - Allow users to use a custom domain namePHP Laravel - 允许用户使用自定义域名
【发布时间】:2014-08-11 05:55:35
【问题描述】:

我几乎浏览了我能找到的关于该主题的每一页,但我还是有点困惑。

我有一个 PHP Laravel 4.0 网站,位于

http://www.mywebsite.com

当用户注册时,每个用户都会获得自己的页面

http://user1.mywebsite.com

我在我的 VPS DNS 管理器 (Linode) 上通过通配符子域设置了上述内容。

在我的 Laravel 中,我有一个域路由,可以获取子域并显示正确的用户页面。一切正常。

现在,我想要实现的是让用户使用他们自己的域名并指向他们在我网站上的页面。

所以如果用户注册了

http://www.user1domain.com

我希望这个域指向http://user1.mywebsite.com

我不想要重定向,但 URL 保持在 http://www.user1domain.com(显然)。

我知道像 Tumblr 这样的网站允许这样做。

我要采取哪些步骤来实现这一目标?这是我在研究过程中想到的一些事情。

  1. 让用户将其自定义域“user1domain.com”指向我的 VPS 名称服务器(简单)。

  2. 在我这边(这就是我的不足之处),是吗

    • 创建一个新的 DNS 条目? (在我的 Linode VPS 中,我会在“DNS 管理器”和“添加域区域”中执行此操作)

    • 我使用的是 Apache,所以我必须创建一个 VirtualHost(就像我为所有其他站点所做的那样),这是否意味着我必须为每个想要使用的用户创建一个新的 VirtualHost 文件自定义域?

    • 如果不是 VirtualHost,我如何实际指向我的 Web 应用程序文件夹?阿帕奇别名? (如何设置?)

  3. 假设用户的域名现在“指向”我的 Web 应用程序,我现在如何在 Laravel 中获取它? (我猜我会像处理子域一样这样做)

感谢您的宝贵时间。

【问题讨论】:

  • 要求用户在您的网站中使用指向其网址的 CNAME 条目?
  • 嗨@itachi。您的意思是 user1domain.com 通过 CNAME 别名为 user1.mywebsite.com 吗?如果 CNAME 对用户不可用怎么办?不是指向“名称服务器”好吗?
  • 我对 user1domain.com 指向 user1.mywebsite.com 但 URL 仍为 user1domain.com 有点困惑。这没有多大意义。你是不是只想说user1domain.com必须和mywebsite.com指向同一个主机和同一个代码?通过检测请求来自哪个域名,您的一个代码库知道该做什么?

标签: php apache laravel dns


【解决方案1】:

问题:创建一个新的 DNS 条目? (在我的 Linode VPS 中,我会在“DNS 管理器”和“添加域区域”中执行此操作)

回答:是的,您需要让您的用户将他们的域指向您的域名服务器。您还必须将他们的域添加到您的 DNS 管理器中。

问题:我使用的是 Apache,所以我必须创建一个 VirtualHost(就像我为所有其他网站所做的那样),这是否意味着我必须为每个想要使用的用户创建一个新的 VirtualHost 文件自定义域?

如果不是 VirtualHost,我如何实际指向我的 Web 应用程序文件夹?阿帕奇别名? (如何设置?)

回答:您可以只为所有人设置一个虚拟主机配置,如 Using default vhosts 中所述。

<VirtualHost _default_:80>
    DocumentRoot /var/www/mysharedsite
    # ...
</VirtualHost>

因此,向您的服务器发出请求的所有域名都将由您唯一的一个代码库提供服务。

问题:假设用户的域名现在“指向”我的 Web 应用程序,我现在如何在 Laravel 中获取它? (我猜我会像处理子域一样这样做)

我现在能想到两种方法。是的,您可以在 Sub-Domain Routing 上调整 Laravel 的文档,但改为用于不同的域:

Route::group(array('domain' => 'user1domain.com'), function()
{
    Route::get('blog/{id}', 'BlogController@view');
});

但我认为不同域之间的功能将完全相同,只是数据会发生变化,您可以始终使用:

Request::getHost();

因此您获得了域,并可能将其映射到数据库中的 website_id 列以获取正确的内容。

确保在您的项目中仔细地将可接受的域名列入白名单。让所有域名进入并不是一个好主意。您也可以在虚拟主机中使用ServerNameServerAlias 进行限制,但我想这会限制让新用户拥有自己的域的灵活性。

【讨论】:

  • 这很棒。但是,当使用这种方法时,如何才能轻松开启 SSL。
  • 在 LEMP 服务器上怎么样 @Unnawut 先生?
【解决方案2】:

上述答案建议将域指向主要应用程序名称服务器。在大多数情况下,这并不理想,因为您可能仍希望将域与其他提供商一起使用其他子域/电子邮件。

因此,带有应用程序 IP 的 A 记录是最好的情况,因为它让您的客户可以控制他们的域

【讨论】:

    【解决方案3】:

    基本上,对于创建的动态通配符,您只需要这个..

    1. 将域(A 记录)上的通配符设置为您的服务器 IP 地址

      *.mywebsite.com IN A 192.168.1.1
      
    2. 在 VirtualHost 中为域名设置您的服务器名和服务器别名 Apache Conf

      ServerName mywebsite.com
      
      ServerAlias mywebsite.com *.mywebsite.com 
      
    3. 清除窗口控制台上的 dnscache

      ipconfig/flushdns 
      

    希望有帮助

    【讨论】:

    • 此响应特定于子域​​和窗口。该操作已询问顶级域。请考虑修改。
    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2015-08-21
    • 2020-05-26
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多