重写在.htaccess vs vhost中表现不同

时间:2012-02-26 16:41:35

标签: mod-rewrite url-rewriting

我正在使用以下大量指令将www重写为非www url:

<IfModule mod_rewrite.c>
  RewriteEngine On

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

如果我将它放在.htaccess文件中,它可以正常工作。

如果我将它放在vhost文件中,在重写两个正斜杠后会添加到主机,例如www.domain.com将成为domain.com //

我错过了什么吗?

另外,是否值得将所有.htaccess内容放在vhost performancewise中?

1 个答案:

答案 0 :(得分:5)

RewriteRule的行为就像文档所说的那样。

RewriteRule上下文与VirtualHost上下文匹配的内容有所不同Directory & .htaccess上下文。

来自RewriteRule Directive Apache Docs

  

匹配什么?

     

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

     

在Directory和htaccess上下文中,在删除将服务器引导到当前RewriteRule的前缀(例如“app1 / index.html”或“index.html”取决于where)之后,Pattern将首先与文件系统路径匹配。指令已定义。)

     

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

因此,当VirtualHost中的服务器不在directory上下文中时,前缀/将不会被删除。另请注意,在RewriteRule上下文中与VirtualHost匹配时,模式始终以/开头。

所以,你的RewriteRule应该是:

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


此外,是否值得在vhost中以性能方式放置所有.htaccess内容?

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