.htaccess 正则表达式可以获得最佳性能吗?

.htaccess 正则表达式可以获得最佳性能吗?

在我的 .htaccess 文件中,我尝试使用以下命令阻止一些机器人:

RewriteCond %{HTTP_USER_AGENT} ^badbot [NC]

但是,我想将这些条件更改为更具包容性的条件,例如:

方法 1: RewriteCond %{HTTP_USER_AGENT} .*badbot [NC,OR]

或者

方法 2: RewriteCond %{HTTP_USER_AGENT} ^.*badbot [NC,OR]

或者

方法 3: RewriteCond %{HTTP_USER_AGENT} badbot [NC,OR]

问题是,这三种方法中的哪一种最适合服务器性能?

谢谢!

答案1

据我所知,它们之间的性能差异很小。从逻辑上讲,和/.*badbot/应该/badbot/是等效的,而且由于正则表达式是从左到右解析的,所以我也认为^没有区别。

我用 Perl 测试了这些代码(Perl 使用的正则表达式引擎可能与 mod_rewrite 略有不同),结果显示它比其他代码快很多,但这可能与我使用的字符串有关。另外,请记住 USER_AGENT 的最大长度为 200,这可能是不必要的优化。将它们放在而不是/badbot/中可以获得更多优化。httpd.conf.htaccess

我测试得到的结果是:

[james@aladdin ~]$ time perl -e 'my $x = "bad" x 99999999; $x .= "badbot"; print "true" if $x =~ /^.*badbot/;'  
true  
real    0m2.575s  
user    0m1.847s  
sys 0m0.712s  
[james@aladdin ~]$ time perl -e 'my $x = "bad" x 99999999; $x .= "badbot"; print "true" if $x =~ /badbot/;'  
true  
real    0m2.110s  
user    0m1.378s  
sys 0m0.691s  
[james@aladdin ~]$ time perl -e 'my $x = "bad" x 99999999; $x .= "badbot"; print "true" if $x =~ /.*badbot/;'  
true  
real    0m2.522s  
user    0m1.866s  
sys 0m0.647s

答案2

如果您寻求最佳性能...首先让 Apache 忽略/跳过查找 .ht 文件..禁用 .htaccess.. :D

AllowOverride None

并将您的内容/重写/等直接放入每个虚拟主机中。

然后选择 1、2 或 3 :D

那么你已经向“更快”迈进了一步

希望这有帮助.. :D

相关内容