关于localhost:通配符子域

关于localhost:通配符子域

Wildcard Subdomains

我知道以前有一些线程,但是我已经尝试了所有建议的内容(我可以找到),到目前为止,对我来说没有任何工作...

考虑到这一点,这是我想要做的事情:

首先,我要允许用户发布页面,并为他们提供各自选择的子域(例如:user.mysite.com)。据我所知,最好的方法是使用mod_rewrite和.htaccess将user.mysite.com映射到mysite.com/user-正确吗?

如果那是正确的话,有人可以给我明确的指示来执行此操作吗?

另外,我正在使用MAMP在本地进行所有开发,因此如果有人可以告诉我如何设置本地环境以相同的方式工作(我已经读过这比较困难),我将不胜感激。老实说,我一直在尝试一切都无济于事,由于这是我第一次这样做,所以我完全迷失了。非常感谢您的帮助!

更新:这些答案中的一些确实很有帮助,但是对于我所考虑的系统而言,为每个用户手动添加子域不是一个选择。我真正要问的是如何实时执行此操作,并将wildcard.mysite.com重定向到mysite.com/wildcard - Tumblr的设置方式是我想做的一个完美示例。再次感谢!


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

一旦使用DNS主机设置好了,从您的Web应用程序开始,您实际上只是URL重写,这可以通过Web服务器本身的某种模块来完成,例如isapi rewrite(如果您使用的是IIS)如果可能,将是首选路线)。您还可以在应用程序级别处理重写(例如,如果在ASP.NET上使用路由)。

您将重写URL,以便http://myname.domain.com变为http://domain.com/something.aspx?name=myname或其他名称。从那以后,您就像处理myname值一样正常地处理查询字符串即可。那有意义吗?希望我不要误会你的追求。

编辑:

我不建议您为每个用户创建一个子域,而是为域本身创建一个通配符子域,因此,any.domain.com(基本上是* .domain.com)都将进入您的站点。我使用mydomain设置了多个域。他们的设置说明如下:

Yes, you can configure a wild card but
it will only work if you set it up as
an A Record. Wildcards do not work
with a C Name. To use a wildcard, you
use the astericks character '*'. For
example, if you create and A Record
using a wild card, .domain.com,
anything that is entered in the place
where the '' is located, will resolve
to the specified IP address. So if you
enter 'www', 'ftp', 'site', or
anything else before the domain name,
it will always resolve to the IP
address

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

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

    编辑2:

    如果没有DNS条目,则无法执行此操作。"在线世界"需要知道name1.domain.com,name2.domain.com,...,nameN.domain.com都进入服务器的IP地址。唯一的方法是使用适当的DNS条目。您必须使用DNS主机为您的域添加通配符DNS条目。然后,您只需从URL中读取子域并在代码中采取适当的措施即可。


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

    虚拟主机

    您最有可能希望做基于名称的虚拟主机,因为它最容易设置并且只需要一个IP地址(因此在本地MAMP机器上也很容易设置和测试)。基于IP的虚拟主机在其他方面要好一些,但是每个域都必须有一个IP地址。

    此Wikipedia页面在底部讨论了区别,并链接到了如何进行基于名称的虚拟主机的基本入门。

    在本地计算机上进行测试时,还必须在/ etc / hosts中为假的测试域名设置假的DNS名称。也就是说,如果您让Apache在本地主机上侦听并在Apache配置中设置vhost1.test.domain和vhost2.test.domain,则只需将这些域添加到localhost之后/ etc / hosts中的127.0.0.1行中:

    1
    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来匹配子域并将其重定向:

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

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

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

    一起进行虚拟主机和重定向

    最好更加明确,并为要监听的每个主机名设置一个虚拟主机配置部分,并将这些主机名的重写规则放入其虚拟主机配置中。 (如果可以的话,将这种内容放入Apache配置而不是.htaccess中通常会更安全,更快捷-如果您能帮助的话,.htaccess会降低性能,因为Apache会不断地在文件系统中搜索.htaccess文件并进行重新解析,它的安全性较低,因为用户可以将其弄乱。)

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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>

    我意识到我对这个问题的回答很晚了,但是在本地开发解决方案方面我遇到了同样的问题。在另一个SO线程中,我找到了更好的解决方案,并认为以后我将与所有人分享相同的问题:

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

    1
    2
    vcap.me resolves to 127.0.0.1
    www.vcap.me resolves to 127.0.0.1

    或具有更多用途37信号公司拥有一个域,可使用特定格式将任何子域映射到任何给定IP:

    1
    2
    3
    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


    我使用的是Ubuntu 16.04,自14.04开始,我在这里使用了Dave Evans提供的解决方案,它对我来说很好用。

  • 安装dnsmasq

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

    1
    2
    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
  • 编辑/etc/dhcp/dhclient.conf并添加以下行

    1
    prepend domain-name-servers 127.0.0.1;

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

  • 最后一个是重新启动服务

    1
    2
    sudo systemctl restart dnsmasq
    sudo dhclient
  • 最后,您应该检查它是否有效。

    1
    dig whatever.localhost

    注意:

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


    我必须对我的一个站点执行完全相同的操作。您可以按照以下步骤

  • 如果在服务器上安装了cPanel,请创建一个子域*,否则请在DNS中设置A记录(有关BIND的信息,请参见http://ma.tt/2003/10/wildcard -dns-and-sub-domains /)。在您的开发人员上。通过将每个子域添加到您的hosts文件中,您最好不要伪造子域。

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

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


  • 我为Ubuntu 18.04找到的解决方案与此类似,但是涉及到NetworkManager config:

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

    1
    sudo editor /etc/NetworkManager/NetworkManager.conf

    应该看起来像这样:

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

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

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

    1
    sudo systemctl reload NetworkManager
  • 测试一下

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

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

    然后工作:

    1
    2
    3
    4
    dig petproject.local-dev.workdomain.com

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

    根据我在许多Web主机上看到的内容,它们在apache上设置了虚拟主机。

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

    这样,mysite.com / user和user.mysite.com都可以工作。

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


    First, I want to allow users to
    publish pages and give them each a
    subdomain of their choice (ex:
    user.mysite.com). From what I can
    gather, the best way to do this is to
    map user.mysite.com to mysite.com/user
    with mod_rewrite and .htaccess - is
    that correct?

    使用虚拟主机可能会更好。这样,每个用户都可以拥有一个非常独立于其他人的Web服务器配置。

    语法如下所示:

    1
    2
    3
    4
    5
    <VirtualHost *:80>
        DocumentRoot /var/www/user
        ServerName user.mysite.com
        ...
    </VirtualHost>


    推荐阅读