2009-12-03 102 views
4

我有一个网站,我希望用户注册以获取他们自己的子域名。这个子域是虚拟的,每个子域使用相同的Web服务器文件。用户注册时创建子域名

我使用PHP和Apache,我知道虚拟主机,但我想知道我需要把虚拟主机代码放在哪里。首先,我没有访问httpd.conf。其次,我希望在注册后自动完成。

我已阅读关于虚拟主机,但没有找到任何答案我的问题。有没有人能向我解释所有这些一起工作,或知道我能在哪里找到我的答案?

+0

嗯...为什么这属于serverfault.com?这是一个编程问题? – notnoop 2009-12-03 16:23:42

+0

除非他正在编写他自己的虚拟主机程序......这是一个配置问题 – 2009-12-03 17:12:11

+0

这部分是配置问题,但它也需要destionation脚本才能完成,因此没有理由关闭此问题。 – Jacco 2009-12-04 11:33:28

回答

7

你能告诉Apache读一个额外的.conf文件吗? (传统存储您的虚拟主机中的httpd-vhosts.conf)

如果是这样,添加类似以下内容并重新启动你的web服务器

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'] 

即,如果用户请求http://user1.domainname.com/index.php

$ _ SERVER [ 'HTTP_HOST']将有user1.domainname.com

,那么你可能会爆炸( ' '$ _ SERVER [' HTTP_HOST'])检查各段..等

+0

我想知道是否必须获得(虚拟)专用服务器来执行此操作。我是否正确:如果我通常无法将虚拟主机添加到传统的Web主机,因为受到Apache配置访问的限制? – 2009-12-03 16:28:12

+1

否 - 默认情况下,Apache将提供虚拟主机。但是您确实需要访问服务器:1.您需要能够创建一个虚拟主机包含文件(位于/etc/httpd/conf.d/vhostname.conf中)。 2.你将需要能够循环Apache(重新启动)。 3.您需要能够更改DNS。 – ChronoFish 2009-12-03 16:38:27

+0

是的,如果你没有访问你的Apache配置,这是不可行的。 当您向子服务器请求您的服务器时,您是否检查过$ _SERVER ['HTTP_HOST']?也许你已经配置好了...... – jlb 2009-12-03 16:39:22

2

(由Janek的评论启发)

如果你的Apache实例配置为*走样,那么就没有必要创建一个虚拟的命名主机 - 通过评估$ _ SERVER [您可以伪造它与PHP” 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(这意味着你无法访问很多东西),这将很难实现。编程不会 - 但实施将是。

这里的原因:

  1. 的Apache默认情况下将成为虚拟主机。但是你确实需要访问服务器的conf目录(通常位于/etc/httpd/conf.d/),所以你可以创建虚拟主机的“include”文件(如果Apache配置被设置为包含它 - 最近的安装应该是)。

  2. 您将需要能够循环Apache(重新启动)。如果没有这个,虚拟主机的更改不会生效。

  3. 您将需要能够更改DNS。您可以随时更改您的本地/ etc/hosts文件 - 但为了让访问者访问您的网站,您需要能够通过DNS更改。 (可能瞬间 - 或可能需要24小时才能传播)。

的脚本肯定可以做到的(见cPanel和WHM)

+0

+1:不确定你的意思是什么/ etc/hosts的东西,但是如果你可以添加一个dns记录,比如* .mywebsite.com CNAME mywebsite.com,你可以使用$ _SERVER ['HTTP_HOST ']并从那里拿走。 – jeroen 2009-12-03 18:22:59

+0

谢谢您的详细解释!我与我的主持人聊天,他们支持DNS通配符。据我了解,我可以用'$ _SERVER ['HTTP_HOST']'得到子域? – 2009-12-03 20:20:54

2

您将需要3事情是:

1. 设置你的DNS为* .yourDomain.com

2. 将ServerAlias指令添加到此域的apache配置中:

ServerName www.yourDomain.com 
ServerAlias *.yourDomain.com yourDomain.com 

还要确保你的Apache服务器具有UseCanonicalName设置为on(这是默认)

3. grep的子域名与PHP:

$nameChunks = explode('.', $_SERVER['HTTP_HOST']); 
    $subDomainName = $nameChunks[count($nameChunks) - 3]; 
+0

他表示他没有权限访问Apache配置文件 - 否则这就是要做的事情。 – ChronoFish 2009-12-03 17:53:48

+0

由于我的主机支持DNS通配符,因此我可以使用PHP代码来启用子域。通配符被发送到主www文件夹。 – 2009-12-03 20:21:51

+0

这个答案为什么downvoted? – Jacco 2009-12-04 11:35:02

1

您将首先需要设置DNS服务器将任何子域解析为您的主IP地址,即*.domain.com将必须解析为您的服务器的IP地址。然后,Web服务器需要处理所有传入的请求,而不管子域是什么,并调用一些PHP脚本。然后,PHP脚本可以简单地找出来自$_SERVER['HTTP_HOST']标题的请求的域并据此采取行动。

你实际上并不是“在用户注册时创建子域名”。

+0

请注意,此答案已从http://stackoverflow.com/a/13199325/476中移除。 – deceze 2012-11-03 09:00:54