2012-02-26 63 views
2

我使用的指示以下块改写WWW非WWW网址:重写表现不同的.htaccess VS虚拟主机

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L] 
</IfModule> 

如果我把它放在.htaccess文件,它工作正常。

如果我把它放在虚拟主机文件,重写两个斜杠被添加到主机,例如www.domain.com将成为domain.com//

我缺少的东西后?

另外,是否值得将所有.htaccess内容放在虚拟主机的performancewise?

回答

5

RewriteRule表现为文档说。

RewriteRuleVirtualHost上下文& Directory & .htaccess上下文匹配时有什么区别。

RewriteRule Directive Apache Docs

什么是匹配的?

在VirtualHost上下文中,模式最初将与主机名和端口后以及查询字符串(例如“/app1/index.html”)之前的URL部分进行匹配。

在Directory和htaccess上下文中,在删除引导服务器到当前RewriteRule的前缀(例如“app1/index.html”或“index.html”,具体取决于指令在哪里定义)。

如果您希望与主机名,端口或查询字符串匹配,请分别使用RewriteCond和%{HTTP_HOST},%{SERVER_PORT}或%{QUERY_STRING}变量。

所以,当在VirtualHostdirectory上下文没有服务器,使前缀/不会被删除。还请记住在与VirtualHost上下文中的RewriteRule匹配时,模式将始终以/开头。

所以,你RewriteRule应该是:

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule ^/(.*)$ http://%1/$1 [R=301,NC,L] 

VirtualHost背景。


此外,是否值得把所有的.htaccess内容在虚拟主机performancewise?

是的,当然。原因之一是,每次访问页面时都不会读取文件(.htaccess)。

+0

感谢您提供非常丰富的答案和出色的解决方案。我非常感谢你的帮助。 – DavidW 2012-02-26 17:39:58

+0

@Leo欢迎... – ThinkingMonkey 2012-02-26 17:40:47