Я пытался найти решение для этого, но не смог его найти.
Я уже некоторое время использую эти строки в своем htaccess для блокировки старых или устаревших версий Firefox и Chrome, поскольку большинство из них используются ботами/зараженными хостами.
BrowserMatchNoCase "Chrome/[17.0.0.0-86.0.0.0]" bad_bots
BrowserMatchNoCase "Firefox/[3.0-86.0]" bad_bots
Он работал безупречно и, насколько я понимаю, блокировал: (правильно ли я?)
Но недавно, когда Chrome и FF обновились до 100, все работает не так, как ожидалось. Мои правила блокируют эти версии браузеров, поэтому временно я применил грязный обходной путь, добавив:
BrowserMatchNoCase "Chrome/100" !bad_bots
BrowserMatchNoCase "Firefox/100" !bad_bots
etc...
Мой вопрос :
Можно ли обойти эту «проблему» и не блокировать версии браузеров от 100 и более поздних версий? Как ?
Можно ли сохранить эти правила с помощью BrowserMatchNoCase?
Большое спасибо.
BrowserMatchNoCase "Chrome/[17.0.0.0-86.0.0.0]" bad_bots BrowserMatchNoCase "Firefox/[3.0-86.0]" bad_bots
It worked flawlessly and from my understanding it was blocking : (Am I right ?)
- Every Chrome browser version from 17.0.0.0 to 86.0.0.0
- Every Firefox browser version from 3.0 to 86.0.0.0
Нет, это совсем не то! Вы не можете указать такие числовые диапазоны, используя регулярное выражение.
Регулярное выражение [17.0.0.0-86.0.0.0]
представляет собой класс персонажей и такое же, как просто [.012345678]
(или [.0-8]
), которое соответствует одному символу из перечисленных в квадратных скобках. Дефис (-
) указывает на диапазон ascii-символ. например. a-z
.
Итак, ваше регулярное выражение Chrome/[17.0.0.0-86.0.0.0]
соответствует любому пользовательскому агенту, который содержит одну из следующих подстрок:
Chrome/.
Chrome/0
Chrome/1
Chrome/2
Chrome/3
Chrome/4
Chrome/5
Chrome/6
Chrome/7
Chrome/8
Таким образом, он в основном заблокирует любую версию Chrome, которая не начинается с 9
. Другими словами, он разрешит версии с 9 и 90 по 99 и заблокирует все остальные (пока мы в конечном итоге не доберемся до версии 900!).
Если вы все еще хотите следовать тому же подходу и блокировать старые строки пользовательского агента, вам нужно будет следовать своему «грязному обходному пути» и пробивать дыры для пользовательских агентов, которые вы хотите разрешить. Хотя вы можете немного обобщить и разрешить любую версию из сотен, например. 1\d\d
(1, за которой следуют две цифры)
Например, было бы проще заблокировать все, а затем разрешать определенные шаблоны User-Agent:
# Block all Chrome User-Agents
BrowserMatchNoCase "Chrome/" bad_bots
# Allow Chrome versions 87, 88, 89, 90-99, 100+
BrowserMatch "Chrome/(8[789]|9\d|\d\d\d)\." !bad_bots
Обратите внимание, что я специально использовал BrowserMatch
(а не BrowserMatchNoCase
) для случаев разрешается, поскольку официальные пользовательские агенты Chrome всегда будут иметь верхний регистр C
.
@JSSSX Пожалуйста. Документы Apache на самом деле не охватывают регулярное выражение (только краткое введение). Вам необходимо ознакомиться с более подробной документацией по этому вопросу, например: регулярные-выражения.info (синтаксис регулярных выражений, который использует Apache, не уникален для Apache. Это тот же механизм регулярных выражений, который используется PHP и похожий для JavaScript и т. д.)
Еще раз спасибо, это работает как шарм. Я только что отметил ваш ответ как принятый. Я сохраню вашу ссылку, это поможет мне лучше понять, как использовать Regex в следующий раз. Следуя вашему предложению, я также использую BrowserMatch вместо BrowserMatchNoCase, поскольку вы упомянули, что официальный Chrome и FF всегда будут использовать верхний регистр в начале своих соответствующих имен.
Спасибо, мистер Уайт, я знал, что делаю что-то неправильно, и, к сожалению, документация Apache не была достаточно ясной для меня. Вы только что показали, как сделать его лучше и короче, большое спасибо.