2009-07-31 563 views
2

我不想让人们能够在我的网站中注册他们自己的部分,并让这些部分成为我的网站的子域。所以有人可以注册'测试',并有'test.example.com'参考他们的网站,这将是说/ site.php?id = 1那么我怎么会去写一个mod_rewrite规则呢?对子域名使用mod_rewrite

回答

2

mod_rewrite可能不是最好的工具。 RewriteRules非常适合将文件映射到其他内容,但它并非真正意义上的域匹配。

您可以使用mod_rewrite做的最好的是:

RewriteEngine On 
# Skip www.domain.com 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com 
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L] 

这是不是真的有用。我会建议做的,而是如果以编程方式检查这样的HTTP_HOST值:

function get_subdomain() { 
    if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches)) 
    return $matches[1]; 
} 
0

您可以配置Apache要求在Apache配置中的“特殊”的领域(如www.mydomain.com等),在您的虚拟主机容器中,并让其他人默认访问您的第一个虚拟主机。然后,您可以将基础URL重写为调度应用程序,该应用程序将检查URL并将用户发送到正确的区域。

从Apache 2.0的文档:

几乎所有的Apache命令都可以 进入虚拟主机容器。 第一个VirtualHost部分用于 没有已知服务器名称的请求。

把代码来处理* .mydomain.com来在第一虚拟主机:

<VirtualHost *:80> 
    Servername custom.mydomain.com 
    DocumentRoot /var/www/html/custom 
    RewriteEngine on 
    RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R] 
    # more configs here 
</VirtualHost> 

<VirtualHost *:80> 
    Servername www.mydomain.com 
    DocumentRoot /var/www/html/homepage 
    # more configs here 
</VirtualHost> 

在dispatch.cgi,检查URL呼叫,以确定用户应该去。确保你设置你的DNS接受所有子域名。

希望有帮助!

0

实际上,我们一直在使用这种技术,在过去的一年中没有太多问题。我们mod_rewrite的配置是这样的:

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_HOST} !www.mydomain.com 
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com 
RewriteCond %{REQUEST_URI} !admin 
RewriteRule (.*) /admin/ [R=301,L] 
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L] 

会发生什么事,就是将用户定向到theiraccount.mydomain.com/admin。

然后我们使用PHP来识别域名的帐户部分。使用诸如$ _SERVER ['SERVER_NAME']之类的东西或者一些获取域名和分析它的方法非常有效。

尽管将这些配置保存在httpd.conf中,但如果保存为.htaccess,这将成为高流量站点中的cpu问题。