2013-03-01 98 views
3

这是我到目前为止有:.htaccess force“www。”在一切,但子域和删除尾随斜线

#Force www. 
RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} !^www\..+$ [NC] 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

#Remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} (.*)$ 
RewriteRule ^(.+)/$ http://www.domain.com/$1 [R=301,L] 

然而,这打乱了所有子域执行以下操作重定向:

sub.domain.com -> www.sub.domain.com 

而且也,其依赖于写在删除结尾斜杠位上的域。

所以......两个问题。

如何在“删除尾部斜线”位上重写规则以排除在其上写入域?

如何使rewritecond在“force www”排除子域,而不显式写下子域。位?预期的效果

例子 -

sub.domain.com/something/ -> sub.domain.com/something 
domain.com/something/ -> www.domain.com/something 
www.domain.com/ -> www.domain.com 
sub.domain.com -> sub.domain.com 

谢谢!

+0

目前还不清楚你想要发生什么。你能提供一组输入和你想要它们转换成什么? – RoUS 2013-03-01 22:06:57

+0

我加了一些例子! – 2013-03-01 22:30:40

回答

7

更改WWW检查实际的域:

#Force www. 
RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

或者,如果您是举办一堆域,您可以在TLD之前检查名称:

RewriteCond %{HTTPS} !=on 
RewriteCond %{HTTP_HOST} ^([^.]+)\.([a-z]{2,4})$ [NC] 
RewriteRule^http://www.%1.%2%{REQUEST_URI} [L,R=301] 

至于斜线,你必须小心不要求目录的请求。因为如果是这样,并且您打开了DirectorySlash(默认情况下它是打开的),那么您将导致重定向循环。为了排除子域名,我们假设第一条规则重定向浏览器以确保它以“www”开头,并且子域名没有被重定向到以“www”开头,我们可以检查:

#Remove trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule ^(.+)/$ /$1 [R=301,L] 
+0

我用'force www'的第二个选项。无论是那一个还是'删除尾部斜杠'都能很好地工作。 你介意解释一下正则表达式和'force www'中的逻辑吗? – 2013-03-04 03:25:37

+3

@OhCaN我们希望在'%{HTTP_HOST}'变量中有一个'.',所以'^'是字符串的开头,那么'([^。] +)'是一个或多个不是一个'.',然后一个'.',然后'([az] {2,4})匹配2到4个字母(az),字符串结尾是$''。 – 2013-03-04 03:49:03