我想通过以下方式通过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]
答案 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]