RewriteRule:^ vs ^(。*)$ vs ^。* $有区别吗?

时间:2012-10-16 04:24:02

标签: regex mod-rewrite

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

我的目标是将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中有一个被质疑的RewriteRule是RewriteCond和WWW Handler如下:

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]

2 个答案:

答案 0 :(得分:4)

  • ^不会将原始网址作为反向引用进行访问。 $0是一个空字符串。
  • ^.*$可以将整个原始网址作为$0反向引用进行访问(因此您可以执行此操作,例如http://example.com/oldurl.php?url=$0
  • ^(.*)可以将整个原始网址视为$0$1反向引用;当你想在替换中实际使用旧URL时,通常会使用它,因为它更明确地使用了它。

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

答案 1 :(得分: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就像在海洋中打喷嚏一样,希望减少咸味。 :)

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