通配符子域

时间:2008-09-17 03:48:11

标签: subdomain localhost wildcard mamp wildcard-subdomain

我知道之前有过一些线索,但是我已经尝试了所有建议(我能找到的),到目前为止我没有任何工作......

考虑到这一点,我正在努力做到这一点:

首先,我想允许用户发布页面并为每个页面提供他们选择的子域名(例如:user.mysite.com)。从我可以收集到的,最好的方法是使用mod_rewrite和.htaccess将user.mysite.com映射到mysite.com/user - 这是正确的吗?

如果这是正确的,有人可以给我明确说明如何做到这一点吗?

另外,我在本地进行所有开发,使用MAMP,所以如果有人能告诉我如何设置我的本地环境以相同的方式工作(我读过这个更难),我会非常欣赏它。老实说,我一直在尝试一切都无济于事,因为这是我第一次做这样的事情,我完全迷失了。非常感谢您的帮助!

更新: 其中一些答案非常有用,但对于我想到的系统,不能为每个用户手动添加子域。我真正想问的是如何动态执行此操作,并将wildcard.mysite.com重定向到mysite.com/wildcard-Tumblr的设置方式就是我想要做的完美示例。再次感谢!

8 个答案:

答案 0 :(得分:16)

至于如何设置DNS子域通配符,这将是您的DNS托管提供商的功能。这将是不同的步骤,取决于您拥有哪个托管服务提供商,对他们来说将是一个更好的问题。

一旦你使用DNS主机进行了设置,从你的网络应用程序中你真的只是URL重写,这可以通过某种模块为网络服务器本身完成,例如isapi重写,如果你在IIS(如果可能,这将是首选路由)。您也可以在应用程序级别处理重写(如在ASP.NET上使用路由)。

您要重写网址,以便http://myname.domain.com成为http://domain.com/something.aspx?name=myname或其他内容。从那里开始,你只需处理它,就好像myname值在查询字符串中一样正常。那有意义吗?希望我没有误解你所追求的是什么。

修改:

我不是建议您为每个用户创建一个子域,而是为域本身创建一个通配符子域,因此任何 .domain.com(基本上是* .domain.com)都会转到你的网站。我使用mydomain设置了几个域。他们设置这个的说明是这样的:

  

是的,您可以配置外卡但是   它只会在你设置为时才有效   一个记录。通配符不起作用   用C名称。要使用通配符,   使用星号字符'*'。对于   例如,如果您创建和A记录   使用外卡 .domain.com,   在这个地方输入的任何东西   “”所在的位置将会解决   到指定的IP地址。所以,如果你   输入'www','ftp','site'或   域名之前的任何其他内容,   它将始终解析为IP   地址

我有一些以这种方式设置,让* .domain.com进入我的网站。然后,我可以在我的网络应用程序中读取基本URL,以查看ryan.domain.com是当前访问的内容,或者bill.domain.com是使用的内容。然后我可以:

  1. 使用URL重写,以便子域成为查询字符串OR
  2. 的一部分
  3. 只需从访问过的URL中读取主机值,然后根据该值执行一些逻辑。
  4. 这有意义吗?我有几个站点以这种方式设置:使用DNS主机为域创建通配符,然后只需从URL读取主机或基本域,以根据子域(实际上是用户名)决定要显示的内容)

    编辑2:

    没有DNS条目就无法做到这一点。 “在线世界”需要知道name1.domain.com,name2.domain.com,...,nameN.domain.com都会转到您服务器的IP地址。唯一的方法是使用适当的DNS条目。您必须使用DNS主机为您的域添加通配符DNS条目。然后,只需从URL读取子域并在代码中执行适当的操作即可。

答案 1 :(得分:13)

如果您正在运行* AMP,最好的办法就是做Thomas建议并在Apache中执行虚拟主机。您可以使用或不使用您描述的重定向来执行此操作。

虚拟主机

最有可能你会想name-based virtual hosts,因为它最容易设置,只需要一个IP地址(所以也很容易在你当地的MAMP机器上设置和测试)。基于IP的虚拟主机在其他方面更好,但您必须拥有每个域的IP地址。

这个Wikipedia page讨论了如何在底部进行基于名称的虚拟主机的基本步骤的差异和链接。

在本地计算机上进行测试时,您还必须在/ etc / hosts中为假测试域名设置虚假DNS名称。即如果你有Apache侦听localhost并在Apache配置中设置vhost1.test.domain和vhost2.test.domain,你只需将这些域添加到/ etc / hosts中的127.0.0.1行,在localhost:< / p>

127.0.0.1 localhost vhost1.test.domain vhost2.test.domain

完成/ etc / hosts编辑并将基于名称的虚拟主机配置添加到Apache配置文件后,就可以了,重新启动Apache,测试域应该可以正常工作。

使用mod_rewrite重定向

如果您想使用mod_rewrite进行重定向(以便不直接托管user.example.com而是重定向到example.com/user),那么您还需要执行RewriteCond以匹配子域并重定向它:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]

您可以将它放在.htaccess或主Apache配置中。

您需要为要重定向的每个子域添加一对规则,例如最后两个规则。或者,您可以在RewriteCond中捕获子域,以便能够使用一个通配符规则将* .example.com重定向到example.com/ * - 但从安全的角度来看,这对我来说真的很糟糕。

一起,vhosts和重定向

最好更明确地为要监听的每个主机名设置虚拟主机配置部分,并将每个主机名的重写规则放在其虚拟主机配置中。 (将这种东西放在你的Apache配置中更安全,更快,而不是.htaccess,如果你可以帮助它。 - .htaccess会降低性能,因为Apache不断搜索.htaccess文件的文件系统并重新分析它们,以及它不太安全,因为这些可能会被用户搞砸。)

像这样,Apache配置中的vhost配置将是:

NameVirtualHost 127.0.0.1:80

# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
  ServerName example.com
  ServerAlias www.example.com
  DocumentRoot /www/siteroot
  # etc.
</VirtualHost>

# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost1.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>

# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost2.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>

答案 2 :(得分:7)

我意识到我很晚才回答这个问题,但我在本地开发解决方案方面遇到了同样的问题。在another SO thread中,我找到了更好的解决方案,并认为我会在将来为同一个问题的任何人分享这些解决方案:

VMware拥有的通配符域,可将任何子域解析为127.0.0.1:

vcap.me resolves to 127.0.0.1
www.vcap.me resolves to 127.0.0.1

或更多功能37信号拥有一个域,使用特定格式将任何子域映射到任何给定的IP:

127.0.0.1.xip.io resolves to 127.0.0.1
www.127.0.0.1.xip.io resolves to 127.0.0.1
db.192.168.0.1.xip.io resolves to 192.168.0.1

请参阅xip.io了解详情

答案 3 :(得分:3)

我在Ubuntu 16.04和14.04以来我使用的是Dave Evans here提供的解决方案,它对我来说很好。

  1. 安装dnsmasq

    sudo apt-get install dnsmasq
    
  2. 使用以下行在localhost.conf目录下创建新文件/etc/dnsmasq.d

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. 修改/etc/dhcp/dhclient.conf并添加以下行

    prepend domain-name-servers 127.0.0.1;
    

    (您可能会发现此行已存在,您只需要取消注释即可。)

  4. 最后一个是重启服务

    sudo systemctl restart dnsmasq
    sudo dhclient
    
  5. 最后,你应该检查一下它是否正常工作。

    dig whatever.localhost
    

    注意:

    如果要在Web服务器上使用它,只需将127.0.0.0更改为您的实际IP地址即可。

答案 4 :(得分:1)

我必须为我的一个网站做同样的事情。您可以按照以下步骤进行操作

  1. 如果您的服务器上有cPanel,请创建子域*,否则,您必须在DNS中设置A记录(对于BIND,请参阅http://ma.tt/2003/10/wildcard-dns-and-sub-domains/ )。在你的开发。通过将每个子域添加到hosts文件中,您可以更好地伪造子域名。

  2. (如果您使用了cPanel,则不必这样做)。你必须在你的apache vhosts文件中添加如下内容。它在很大程度上取决于您运行的服务器类型(共享或不共享)。以下代码不完整。它只是提供方向。注意:ServerAlias example.com *.example.com很重要。

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. 接下来,由于您可以使用PHP脚本检查“主机”标题并查找子域并相应地提供内容。

答案 5 :(得分:0)

  

首先,我想允许用户访问   发布页面并给每个页面一个   他们选择的子域名(例如:   user.mysite.com)。从我能做到的   聚集,这样做的最好方法是   将user.mysite.com映射到mysite.com/user   使用mod_rewrite和.htaccess - 是   那是对的吗?

使用virtual hosts可能会更好。这样,每个用户都可以拥有几乎独立于其他用户的Web服务器配置。

语法如下:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>

答案 6 :(得分:0)

从我在很多webhost上看到的,他们在apache上设置了一个虚拟主机。

因此,如果您的www.mysite.com是从/ var / www提供的,那么您可以为每个用户创建一个文件夹。然后将虚拟主机映射到该文件夹​​。

有了这个,mysite.com/user和user.mysite.com都可以使用。

至于你的测试环境,如果你在Windows上,我建议编辑你的HOSTS文件,将mysite.com映射到你的本地PC(127.0.0.1),以及你设置用于测试的任何子域。

答案 7 :(得分:0)

我为Ubuntu 18.04找到的解决方案类似于this one,但涉及到NetworkManager配置:

  1. 编辑文件/etc/NetworkManager/NetworkManager.conf,并将行dns=dnsmasq添加到[main]部分

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    应如下所示:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. 开始使用NetworkManager的resolv.conf

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. 使用通配符配置创建文件

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. 重新加载NetworkManager配置

    sudo systemctl reload NetworkManager
    
  5. 测试

    dig localdomain.localhost
    

您还可以添加任何其他域,这对于使用本地开发设置时的某些类型的身份验证非常有用。

echo 'address=/.local-dev.workdomain.com/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/workdomain-wildcard.conf

然后这有效:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1