我有域名example.com
,并已设置 Ubuntu Apache 服务器,以便将任何子域指向具有相同名称的目录。
<VirtualHost *:80>
ServerAlias *.example.com
VirtualDocumentRoot /var/www/html/%1
</VirtualHost>
所以subdomain.example.com
会指向example.com/subdomain
。
我正在尝试允许用户将他们自己的自定义域指向他们选择的子域,我该如何实现这一点,需要哪些记录,以及需要对虚拟主机?
我尝试过如下记录:
sampledomain.example
(别名记录记录)-@
-->sample.example.com
sampledomain.example
(A记录)-@
-->(IP
example.com 的地址)
我也尝试过使用www
CNAME 并删除A record
。
sample.example.com
成功指向example.com/sample
。但是,sampledomain.example
由于某种原因, 却表现得像根站点。
所以如果我访问sampledomain.example/sample
,我将获得的内容example.com/sample
而不是指向sample.example.com
。
我该如何解决这个问题?需要哪些记录以及可以对虚拟主机做什么?
我使用了 CNAME 记录,以便当用户访问时我可以通过 PHP 检索自定义域名 - 是否需要 CNAME?
答案1
如果您愿意根据客户要求手动执行此操作,这很容易。您所要做的就是添加ServerAlias sampledomain.com
到 vhost 配置并重新加载 Web 服务器配置。
但是,如果您想让客户自己在某种客户控制界面上执行此操作,则由于 Web 服务器上虚拟主机的工作方式,这并不容易实现。原因如下:
如果您有任何 DNS 记录(无论是A
还是CNAME
)映射sampledomain.com
到您的 Web 服务器,浏览器将向您的服务器 IP 地址发送请求,并将 HTTPHost
标头设置为sampledomain.com
。 Web 服务器将使用此标头来决定哪个虚拟主机应该处理此问题,如果sampledomain.com
既不是虚拟主机名也不是别名,则请求将由默认虚拟主机应答,正如您所经历的那样。
为了实现这一点,您需要一种让客户为其虚拟主机配置别名的方法。使用 Apache,这并不容易,但理论上您可以从数据库中读取这些信息,如所解释的那样这里(我从未尝试过,所以我不知道这是否有效)。
还有,虚拟最小在这种情况下可能会有帮助。