2

^在 RewriteRule 中使用vs ^(.*)$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 处理程序,如下所示:

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]
4

2 回答 2

5
  • ^使原始 URL 不能作为反向引用访问。$0是一个空字符串。
  • ^.*$使整个原始 URL 可作为$0反向引用访问(因此您可以这样做http://example.com/oldurl.php?url=$0
  • ^(.*)使整个原始 URL 可作为后向引用$0和后向$1引用访问;当您想在替换中实际使用旧 URL 时,通常会使用它,因为它更明确地说明了使用。

它们都匹配相同的东西,但产生不同的反向引用组。

于 2012-10-16T04:35:52.883 回答
1

性能更好的一个是您自己进行基准测试的那个。

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

如果你关心性能,你永远不应该使用.htaccess文件,甚至禁用它们的解析:AllowOverride None. 不禁用它们,并且有这样的请求:http://example.com/sites/css/theme/main.cssApache 仍将尝试加载以下所有文件:

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

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

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

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

于 2013-05-22T11:37:20.817 回答