我正在使用以下大量指令将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中?
答案 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
)。