2012-10-16 81 views
1

使用^ vs ^(.*)$ vs ^.*$作为RewriteRule中的通配符有什么区别?

我的目标是将http://carnarianism.com/(任何东西)重定向到http://carnarian.com/的着陆(默认)页面。我找到了以下解决方案,这些解决方案似乎都有效,所以我想知道哪个更适合性能?

RewriteRule^http://carnarian.com/ [R=301,L] 
RewriteRule ^.*$ http://carnarian.com/ [R=301,L] 
RewriteRule ^(.*)$ http://carnarian.com/ [R=301,L] 

所有这些似乎工作正常。这是我在StackOverflow上的第一篇文章,大部分时间我都可以找到答案。

需要明确的是:上面我的.htaccess中的重写规则的质疑是的RewriteCond和WWW处理程序如下:

RewriteEngine On 
RewriteBase/

# FROM www. --TO-- NO www. See no-www.org 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} carnarianism\.com$ [NC] 
########## The Above Questioned RewriteRule ??? ########## 
RewriteRule^http://carnarian.com/ [R=301,L] 

注:我开始用下面这个搜索,但我不想因为以下该路径也已通过,我希望它仅转到着陆页。因此,我知道你需要圆括号才能使用$ 1变量。我不想要$ 1变量。

RewriteRule ^(.*)$ http://carnarian.com/$1 [R=301,L] 
+0

请参阅http://enarion.net/web/htaccess/migrate-domains/ – Phil

+2

您已经回答了您自己的问题:“[...]您需要圆括号才能使用$ 1变量。” – Gumbo

+1

'这对性能更好?'没有意义的区别。您列出的选项之间的差异将远低于请求时间的1%。绝大多数将是TCP开销,等等。 –

回答

4
  • ^使得没有作为反向引用访问的原始URL的。 $0是一个空字符串。
  • ^.*$使得为$0逆向引用访问完整的原始URL(所以你可以做如http://example.com/oldurl.php?url=$0
  • ^(.*)使得为$0$1反向引用都可以访问完整的原始URL;它通常用于当您希望实际使用替换中的旧URL时使用,因为它对使用更明确。

所有这些匹配相同的东西,但产生不同的反向引用组。

0

更好的表现明智的是你自己进行了基准测试。

但是,由于您使用的是.htaccess文件,而不是直接在服务器中配置此配置(可能通过VirtualHost?),因此只能解析一次,这并不重要。在每个请求中解析.htaccess文件比执行正则表达式的数千倍要花费更多的时间。

如果你关心性能,你永远不应该使用.htaccess文件,甚至禁用它们的解析:AllowOverride None。没有禁用它们,并具有类似的要求:http://example.com/sites/css/theme/main.css Apache将仍然会尝试加载所有的下列文件:

  • .htaccess
  • sites/.htaccess
  • sites/css/.htaccess
  • sites/css/theme/.htaccess

它会生成系统调用即使这些文件不存在。

因此,尝试改进RewriteRule.htaccess文件就像在海洋中打喷嚏,希望减少咸味。 :)

现在,如果您改进了设置以使用服务器配置并回答您的原始问题:^.*$可能比^(.*)$更有效,因为需要创建的引用较少。然而,机会很高,你无法衡量它。

相关问题