通配符子域

时间:2020-03-05 18:57:51  来源:igfitidea点击:

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

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

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

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

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

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

解决方案

回答

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服务器配置。

语法如下所示:

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

回答

至于如何设置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中读取子域并在代码中采取适当的措施即可。

回答

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

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

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

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

回答

如果正在运行* 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行中:

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 [R]

我们可以将其放入.htaccess或者主Apache配置中。

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

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

最好更加明确,并为要监听的每个主机名设置一个虚拟主机配置部分,并将这些主机名的重写规则放入其虚拟主机配置中。 (将此类内容放入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 [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 [R]
</VirtualHost>

回答

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

  • 如果服务器上装有cPanel,请创建一个子域*,否则,我们必须在DNS中设置A记录(有关BIND的信息,请参见http://ma.tt/2003/10/wildcard -dns-and-sub-domains /)。在开发人员上。通过将每个子域名添加到" hosts"文件中,我们最好不要伪造子域名。
  • (如果我们使用了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>
  • 接下来,由于我们可以使用PHP脚本检查"主机"标头并找出子域并相应地提供内容。