HTACCESS - 使用 BrowserMatchNoCase 阻止多个版本的过时浏览器 (Chrome / Firefox)
HTACCESS - Using BrowserMatchNoCase to block multiple versions of obsolete browsers (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
- 从 3.0 到 86.0.0.0 的每个 Firefox 浏览器版本
但是最近,由于 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]
是一个 字符 class 并且与简单的 [.012345678]
(或 [.0-8]
)相同,它匹配方括号之间列出的字符中的单个字符。连字符 (-
) 表示 ascii 字符 范围。例如。 a-z
.
因此,您的正则表达式 Chrome/[17.0.0.0-86.0.0.0]
匹配任何包含以下子字符串之一的 user-agent:
Chrome/.
Chrome/0
Chrome/1
Chrome/2
Chrome/3
Chrome/4
Chrome/5
Chrome/6
Chrome/7
Chrome/8
因此,它基本上会阻止任何不以 9
开头的 Chrome 版本。换句话说,它将允许版本 9 和 90 到 99 并阻止所有其他版本(直到我们最终获得版本 900!)。
如果您仍然想采用相同的方法并阻止旧的 user-agent 字符串,那么您将需要遵循您的“肮脏的解决方法”并为您确实想要允许的 user-agent 打孔.尽管您可以概括一点并允许数百个版本中的任何版本,例如。 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
请注意,自官方 Chrome User-Agent 以来,我专门针对 允许的 案例使用了 BrowserMatch
(而不是 BrowserMatchNoCase
) s 总是大写 C
.
我试图找到解决这个问题的办法,但没能找到。
我已经在我的 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
- 从 3.0 到 86.0.0.0 的每个 Firefox 浏览器版本
但是最近,由于 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]
是一个 字符 class 并且与简单的 [.012345678]
(或 [.0-8]
)相同,它匹配方括号之间列出的字符中的单个字符。连字符 (-
) 表示 ascii 字符 范围。例如。 a-z
.
因此,您的正则表达式 Chrome/[17.0.0.0-86.0.0.0]
匹配任何包含以下子字符串之一的 user-agent:
Chrome/.
Chrome/0
Chrome/1
Chrome/2
Chrome/3
Chrome/4
Chrome/5
Chrome/6
Chrome/7
Chrome/8
因此,它基本上会阻止任何不以 9
开头的 Chrome 版本。换句话说,它将允许版本 9 和 90 到 99 并阻止所有其他版本(直到我们最终获得版本 900!)。
如果您仍然想采用相同的方法并阻止旧的 user-agent 字符串,那么您将需要遵循您的“肮脏的解决方法”并为您确实想要允许的 user-agent 打孔.尽管您可以概括一点并允许数百个版本中的任何版本,例如。 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
请注意,自官方 Chrome User-Agent 以来,我专门针对 允许的 案例使用了 BrowserMatch
(而不是 BrowserMatchNoCase
) s 总是大写 C
.