将mod_rewrite用于子域

时间:2009-07-31 02:23:46

标签: php mod-rewrite subdomain

我不希望人们能够在我的网站中注册他们自己的部分,并让这些部分成为我自己的网站子域。所以有人可以注册'test'并让'test.example.com'引用他们的网站,比如说/site.php?id=1那么我该如何为此编写一个mod_rewrite规则呢?

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

来自Apache 2.0文档:

  

几乎所有的Apache指令都可以使用   进入VirtualHost容器。该   第一个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设置为接受所有子域。

希望有所帮助!

答案 2 :(得分: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问题。