htaccess - 仅重定向非子域请求

时间:2013-06-20 20:54:43

标签: apache .htaccess

...除了www,当然也是一个子域名。

这是我当前的htaccess规则,添加了评论:

RewriteEngine On

#redirect non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

#what does this do?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/login/

#rewrite /a/1 to /index.php?action=a&urlId=1
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?action=$1&urlId=$2 [L,QSA]

#rewrite /a to /index.php?action=a
RewriteRule ^([^/]+)/?$ index.php?action=$1 [L,QSA]

现在我的问题是,我添加了两个子域a.domain.com和b.domain.com指向同一目录,因此它们通过相同的htaccess - 但它们用于直接静态文件访问。如何阻止a.example.comb.example.com完全使用上述规则?

也许有人可以解释这是做什么的:

#what does this do?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/login/

谢谢!

1 个答案:

答案 0 :(得分:1)

解决方案是添加一个条件,在执行RewriteRule之前检查主机是否为domain.com

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$

关于你的第二个问题,一个或多个RewriteCond指令不是单独的指令,而是与RewriteRule相关联,它们是执行RewriteRule必须有效的条件。

在你的情况下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/login/
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?action=$1&urlId=$2 [L,QSA]

仅当请求的uri未指向文件且不以/ login /开头时才执行rewriteRule。