我有一个关于子域名如何工作的相当新手的问题。
据我所知,DNS服务器首先指定对某个subdomain.domain.com的请求必须转到domain.com的IP地址,然后domain.com的Web服务器进一步处理该请求并显示所需的子域页面。
我不太清楚(例如 Apache)服务器是如何做到这一点的。据我所知,vhosts.conf
文件中可以有指定包含子域数据的文件夹的条目。例如:
<VirtualHost *>
ServerName www.domain.com
DocumentRoot /home/httpd/htdocs/
</VirtualHost>
<VirtualHost *>
ServerName subdomain.domain.com
DocumentRoot /home/httpd/htdocs/subdomain/
</VirtualHost>
并且还可以在.htaccess
文件中存在重定向条目,例如
rewritecond %{http_host} ^subdomain.domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/subdomain/ [r=301,nc]
然而在这种情况下,用户会被定向到包含子域数据的目录,但用户会“退出”子域。
我想知道 - 当转到时,地址的开头如何subdomain.domain.com
在subdomain.domain.com
资源管理器的地址栏中保持可见?
可以通过.htaccess
文件中的备用条目来实现吗?
如果VirtualHost
在文件中指定了一个条目vhosts.conf
,是否意味着必须指定一个新用户帐户才能访问此目录?
答案1
HTTP/1.1 要求每个主机都包含所请求服务器的名称。因此,对 的请求http://www.foo.bar.com
将首先进行 DNS 查找,以查看与 关联的服务器www.foo.bar.com
。这可能是指向 Web 服务器的 CNAME 条目,并且可能同一 Web 服务器为 提供内容http://courses.cs.bar.com
。这两个地址都指向同一个地方,但 Apache 可以区分这两个地址,因为它可以看到浏览器在每次请求时尝试访问的位置。
因此假设 DNS 发送www.domain.com
流量subdomain.domain.com
到同一个服务器,该服务器对每个流量都有不同的配置,并且能够提供不同的文档。
在单个主机上使用两个虚拟主机在功能上相当于拥有两个独立的物理 Web 服务器。
无需指定新用户帐户即可访问。所有文件都由运行 apache 的用户(通常是用户)访问apache
。此用户必须能够读取它所服务的所有文件(在两个文档根目录中)。
重写规则在虚拟主机处理之前生效。在这种情况下,Web 服务器会重写 URL,使客户端指向不同的 URL。mod_rewrite 还会向浏览器发送 301,告知其内容位于其他地方。根据 HTTP 规范,任何收到此代码的浏览器都必须切换到从给定的 HTTP 地址发出请求(替换浏览器地址行中的旧地址)。
这就像每次用户进入子域名时,都会给他们一个显示“这是其他地方”的页面,并要求他们在浏览器中输入新地址。
由于 VirtualHost 条目是主服务器配置的一部分,而不是特定于目录的选项,因此不能将它们放入 .htaccess 文件中。
回答关于两个子域的配置的问题:
<VirtualHost *>
ServerName www.domain.com
DocumentRoot /public_html
</VirtualHost>
<VirtualHost *>
ServerName subdomain.domain.com
DocumentRoot /public_html/subdomain
</VirtualHost>
确保这是您想要的;如果用户将“subdomain”附加到 URL,则“subdomain”的所有内容都将可以从“www”地址访问。
对于您的第二个问题,可以使用 ServerAlias 来实现。这基本上意味着有一个虚拟服务器,但可以通过多个名称访问它。
<VirtualHost *>
ServerName www.domain.com
ServerAlias subdomain.domain.com
DocumentRoot /public_html
</VirtualHost>
至于最后一点,如果您有权修改 DNS 和主 Apache 配置,则无需其他任何操作。我不知道您的特定托管服务提供商是如何运作的;如果您无权访问这两项内容,您可能需要与他们协商。