PHP Laravel - 允许用户使用自定义域名

10

我已经研究过这个主题的几乎每一页,但我仍然有点困惑。

我有一个 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应用程序文件夹?是使用Apache的别名?(我该如何设置?)

  3. 假设现在用户的域名“指向”我的Web应用程序,我该怎么在Laravel中使用它?(我猜我会用与我的子域相同的方式来做这件事)

感谢您的时间。


请向用户询问是否可以使用CNAME记录将其网址指向您的站点? - itachi
嗨@itachi。您的意思是将user1domain.com通过CNAME别名到user1.mywebsite.com吗?如果用户无法使用CNAME,怎么办?指向“nameserver”不可以吗? - ericbae
我有点困惑于http://www.user1domain.com指向http://user1.mywebsite.com,但URL仍为http://www.user1domain.com。这没有太多意义。你是不是只想说http://www.user1domain.com必须指向与http://www.mywebsite.com相同的主机和代码?通过检测请求来自哪个域名,您的一个代码库知道该做什么? - Unnawut
3个回答

11

问题:如何创建新的DNS记录?(在我的Linode VPS中,我会在“DNS管理器”和“添加域区域”中完成此操作)

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

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

如果不使用VirtualHost,那么我如何实际指向我的Web应用程序文件夹?Apache别名?(我该如何设置?)

回答:您可以设置一个虚拟主机配置来适用于所有人,文档在Using default vhosts中有说明。

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

所以所有请求到你的服务器的域名都将由你唯一的代码库提供服务。

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

我现在可以想到两种方法。是的,你可以借鉴 Laravel 的子域路由文档,但是改为用于不同的域名:

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

但我认为在不同的领域之间,功能应该是相同的,只有数据不同,您可以始终使用:

Request::getHost();

所以你获取了该域名,然后可能将其映射到数据库中的website_id列,以获取正确的内容。

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


1
这很棒。然而,当使用这种方法时,我如何轻松地关闭SSL呢? - FooBar
先生,LEMP服务器怎么样?@Unnawut - Goper Leo Zosa
在当今时代,我认为HTTPS必须作为答案的一部分,并且使用默认的VirtualHost无法实现它。 - bilogic

0
以上答案建议将域名指向主应用程序名称服务器。 在大多数情况下,这可能不是理想的,因为您可能还希望使用该域名与其他提供商的其他子域名/电子邮件。
因此,具有指向应用程序IP的A记录是最佳选择,因为它可以让您的客户控制其域名。

-1

基本上,要创建动态通配符,您只需要这样做...

  1. 在域名上设置通配符(A记录)指向服务器的IP地址

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

    ServerName mywebsite.com
    
    ServerAlias mywebsite.com *.mywebsite.com 
    
  3. 在Windows控制台清除DNS缓存

    ipconfig/flushdns 
    
希望这能帮到你。

此回复仅适用于子域和Windows。OP询问的是顶级域名,请考虑修改。 - ggordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接