Назад | Перейти на главную страницу

.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} [NC, OR]

Вопрос в том, какой из этих 3 методов лучше всего подойдет для производительности сервера?

Спасибо!

Если вы ищете оптимальную производительность ... Во-первых, пусть Apache игнорирует / пропускает поиск файлов .ht .. Отключите .htaccess ..: D

AllowOverride None

И помещайте свои вещи / перезаписи / и т.д. прямо в каждый vhost ..

Затем выберите 1,2 или 3: D

Тогда вы уже сделали шаг в сторону «быстрее»

Надеюсь, это поможет ..: D

Насколько мне известно, разница в производительности между ними небольшая. По логике, /.*badbot/ и / badbot / должны быть эквивалентными, и, поскольку регулярные выражения анализируются слева направо, я бы также подумал, что ^ не имеет значения.

Я тестировал их с помощью Perl (который может использовать несколько другой движок регулярных выражений, чем mod_rewrite), и он действительно показал, что / badbot / работает немного быстрее, чем другие, но это могло быть связано с используемыми мной строками. Кроме того, учитывая, что максимальная длина USER_AGENT составляет 200, это, вероятно, ненужная оптимизация. Вы получите больше оптимизации, поместив их в 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