我有一个网站,我希望注册的用户获得自己的子域。该子域是虚拟的,每个子域都使用相同的 Web 服务器文件。
我使用 PHP 和 Apache,我知道虚拟主机,但我想知道我需要将虚拟主机代码放在哪里。首先,我无权访问 httpd.conf。其次,我希望在注册时自动完成。
我已经阅读了有关虚拟主机的信息,但没有找到任何可以回答我问题的内容。有没有人可以向我解释这一切是如何协同工作的,或者知道我在哪里可以找到我的答案?
我有一个网站,我希望注册的用户获得自己的子域。该子域是虚拟的,每个子域都使用相同的 Web 服务器文件。
我使用 PHP 和 Apache,我知道虚拟主机,但我想知道我需要将虚拟主机代码放在哪里。首先,我无权访问 httpd.conf。其次,我希望在注册时自动完成。
我已经阅读了有关虚拟主机的信息,但没有找到任何可以回答我问题的内容。有没有人可以向我解释这一切是如何协同工作的,或者知道我在哪里可以找到我的答案?
你能告诉 apache 读取一个额外的 .conf 文件吗?(传统上,您将虚拟主机存储在 httpd-vhosts.conf 中)
如果是这样,请添加以下内容并重新启动您的网络服务器
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /abs/path/to/webroot
ServerName domainname.com
ServerAlias *.domainname.com
<Directory /abs/path/to/webroot>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
然后在 php 中,您可以通过检查查看用户请求的子域:
$_SERVER['HTTP_HOST']
IE。如果用户请求http://user1.domainname.com/index.php
$_SERVER['HTTP_HOST'] 将有 user1.domainname.com
然后你可以explode('.', $_SERVER['HTTP_HOST']) 来检查每个段..等等。
(灵感来自 Janek 的评论)
如果您的 Apache 实例配置为 * 别名,则无需创建虚拟命名主机 - 您可以使用 PHP 通过评估 $_SERVER['HTTP_HOST'] 来伪造它。
要确定您的 Apache 实例是否会处理它,请编辑您的本地 /etc/hosts 文件(或 Windows 等效文件 - %SystemRoot%\system32\drivers\etc\hosts),以便所需的虚拟名称指向您的服务器。
例如
# An example HOSTS file.
192.168.1.4 testserver testserver.com subdomain.testserver.com secondname.com
这假设 192.168.1.4 是您服务器的 IP。之后的所有内容都是可以调用服务器的别名。
然后,正如 Janek 建议的那样,创建一个页面echo $_SERVER['HTTP_HOST']来查看它是否正确捕获了名称。如果是这样,那么只需要更改 DNS,Apache 就可以保持不变。
否则,如果无法访问 Apache.conf(这意味着您无法访问很多东西),这将很难实现。编程不会——但实现会。
原因如下:
默认情况下,Apache 将提供虚拟主机。但是您确实需要访问服务器的 conf 目录(通常位于 /etc/httpd/conf.d/),以便您可以创建虚拟主机“包含”文件(如果 Apache 配置设置为包含它 - 最近的安装应该是)。
您将需要能够循环 Apache(重新启动)。没有这个,虚拟主机更改将不会生效。
您将需要能够更改 DNS。您可以随时更改本地 /etc/hosts 文件 - 但为了让访问者访问您的站点,您需要能够推动 DNS 更改。(这可能是瞬时的 - 或者可能需要 24 小时才能传播)。
脚本当然可以完成(参见 Cpanel 和 WHM)
为此,您将需要 3 件事:
1. 为 *.yourDomain.com 设置 DNS
2. 将 ServerAlias 指令添加到该域的 apache 配置中:
ServerName www.yourDomain.com
ServerAlias *.yourDomain.com yourDomain.com
还要确保您的 apache 服务器已UseCanonicalName设置为on(这是默认设置)
3. 用 PHP grep 子域名:
$nameChunks = explode('.', $_SERVER['HTTP_HOST']);
$subDomainName = $nameChunks[count($nameChunks) - 3];
您首先需要设置 DNS 服务器以将任何子域解析为您的主 IP 地址,即*.domain.com必须解析为您的服务器的 IP 地址。然后,Web 服务器也需要处理所有传入的请求,而不管子域如何,调用一些 PHP 脚本。然后,PHP 脚本可以简单地找出从$_SERVER['HTTP_HOST']标头请求的域并采取相应的行动。
您实际上并不是“在用户注册时创建子域”。