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

Dav*_*idW 2 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>
Run Code Online (Sandbox Code Playgroud)

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

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

我错过了什么吗?

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

Thi*_*key 5

RewriteRule 表现得像文档说的那样.

RewriteRuleVirtualHost上下文和Directory & .htaccess上下文中匹配的内容有所不同.

来自RewriteRule指令Apache Docs

匹配的是什么?

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

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

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

因此,当VirtualHost服务器不在directory上下文中时,/不会删除前缀.还记得匹配时RewriteRuleVirtualHost情况下,该模式将总是开始/.

所以,你的RewriteRule应该是:

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

VirtualHost上下文中.


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

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