HTACCESS — Использование BrowserMatchNoCase для блокировки нескольких версий устаревших браузеров (Chrome/Firefox)

Я пытался найти решение для этого, но не смог его найти.

Я уже некоторое время использую эти строки в своем htaccess для блокировки старых или устаревших версий Firefox и Chrome, поскольку большинство из них используются ботами/зараженными хостами.

BrowserMatchNoCase "Chrome/[17.0.0.0-86.0.0.0]" bad_bots
BrowserMatchNoCase "Firefox/[3.0-86.0]" bad_bots

Он работал безупречно и, насколько я понимаю, блокировал: (правильно ли я?)

  • Все версии браузера Chrome от 17.0.0.0 до 86.0.0.0
  • Все версии браузера Firefox от 3.0 до 86.0.0.0

Но недавно, когда Chrome и FF обновились до 100, все работает не так, как ожидалось. Мои правила блокируют эти версии браузеров, поэтому временно я применил грязный обходной путь, добавив:

BrowserMatchNoCase "Chrome/100" !bad_bots
BrowserMatchNoCase "Firefox/100" !bad_bots
etc...

Мой вопрос :

Можно ли обойти эту «проблему» и не блокировать версии браузеров от 100 и более поздних версий? Как ?

Можно ли сохранить эти правила с помощью BrowserMatchNoCase?

Большое спасибо.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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.

Спасибо, мистер Уайт, я знал, что делаю что-то неправильно, и, к сожалению, документация Apache не была достаточно ясной для меня. Вы только что показали, как сделать его лучше и короче, большое спасибо.

JSSSX 09.04.2022 19:33

@JSSSX Пожалуйста. Документы Apache на самом деле не охватывают регулярное выражение (только краткое введение). Вам необходимо ознакомиться с более подробной документацией по этому вопросу, например: регулярные-выражения.info (синтаксис регулярных выражений, который использует Apache, не уникален для Apache. Это тот же механизм регулярных выражений, который используется PHP и похожий для JavaScript и т. д.)

MrWhite 09.04.2022 19:44

Еще раз спасибо, это работает как шарм. Я только что отметил ваш ответ как принятый. Я сохраню вашу ссылку, это поможет мне лучше понять, как использовать Regex в следующий раз. Следуя вашему предложению, я также использую BrowserMatch вместо BrowserMatchNoCase, поскольку вы упомянули, что официальный Chrome и FF всегда будут использовать верхний регистр в начале своих соответствующих имен.

JSSSX 09.04.2022 19:59

Другие вопросы по теме