Mod rewrite 重写在.htaccess和vhost中的行为不同

Mod rewrite 重写在.htaccess和vhost中的行为不同,mod-rewrite,url-rewriting,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> 重新启动发动机 重写cond%{HTTP_HOST}^www\.(.+)$[NC] 重写规则^(.*)$http://%1/$1

我使用以下指令将www重写为非www url:

<IfModule mod_rewrite.c>
  RewriteEngine On

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

重新启动发动机
重写cond%{HTTP_HOST}^www\.(.+)$[NC]
重写规则^(.*)$http://%1/$1[R=301,NC,L]
如果我把它放在.htaccess文件中,它就可以正常工作

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

我错过什么了吗


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

RewriteRule
的行为正如文档所说

VirtualHost
context&
Directory&.htaccess
context中,与
RewriteRule
匹配的内容有所不同

什么是匹配的

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

在Directory和htaccess上下文中,在删除将服务器引导到当前重写规则的前缀(例如“app1/index.html”或“index.html”,具体取决于指令的定义位置)后,模式最初将与文件系统路径匹配

如果希望匹配主机名、端口或查询字符串,请分别使用%{HTTP_HOST}、%%{SERVER_port}或%{query_string}变量的RewriteCond

因此,在
VirtualHost
中时,中的服务器不在
目录
上下文中,因此前缀
/
不会被删除。还要记住,在
VirtualHost
上下文中与
RewriteRule
匹配时,模式将始终以
/
开头

因此,您的
重写规则应该是:

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


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


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

感谢您提供了非常详细的答案和出色的解决方案。我真的很感谢你的帮助。