htaccess mod rewrite - 如何创建虚拟子域名?

时间:2010-08-11 05:44:28

标签: .htaccess mod-rewrite subdomain

我想通过以下方式通过htaccess创建虚拟子域名。

输入:

http://testuser.domain.com/1/2/3/

应处理为:

http://www.domain.com/user.php?id=testuser&var1=1&var2=2&var3=3

但是,这个重写不应该使用user.php,而是使用index.php,以防有人进入:

http://www.domain.com or http://domain.com

这是我到目前为止所得到的,但它似乎不起作用。 任何来自mod重写专家的帮助都将非常感激。 提前谢谢。

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
RewriteRule ^(.*)/?(.*)/?(.*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
RewriteRule ^(.*)/?(.*)/?(.*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]

1 个答案:

答案 0 :(得分:2)

你的规则实际上非常接近你想做的事情。我能看到的唯一问题是你的两个RewriteRule语句的测试模式。目前,你有

RewriteRule ^(.*)/?(.*)/?(.*)/?$ ...

......恰好相当于:

RewriteRule ^(.*)$

这是因为第一个捕获组之后的所有内容都不能匹配,仍然被视为匹配,因此第一个组是贪婪的并匹配整个输入字符串,而不需要遵循模式的其他部分。

由于捕获组不应该捕获正斜杠,因为它们在这里被用作变量分隔符,直接的解决方法是将它们更改为[^/]*,如下所示:

修改:我还修改了第二组中的RewriteCond设置,以便在!-f的情况下忽略/index.php条件,如果您请求域名后没有任何内容的子域名。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]