.htaccess中精准阻止特定IP段的方法(无需逐个罗列IP且避免误拦截)
.htaccess中精准阻止特定IP段的方法(无需逐个罗列IP且避免误拦截)
嘿,我来给你把这个问题说透——刚好你喜欢通过例子学,那我直接上干货,结合你给的所有场景拆解,保证你看完就能直接用,完全不用挨个写几十上百个IP,还能彻底避免误拦!
核心思路:用mod_rewrite做精准正则匹配
大部分虚拟主机都默认开了mod_rewrite模块,这是目前最灵活、最靠谱的方式:直接对IP的第四段做数值范围匹配,精准卡到你要的区间,半点儿不会碰无关IP。
所有规则都要先在.htaccess开头加这句开启指令,不然规则不会生效:
RewriteEngine On
先解决你最初的需求:拦截192.0.2.120 - 192.0.2.250
直接加这段规则就行,精准卡120到250的第四段,绝对不会碰119或者251:
# 精准拦截192.0.2.120 - 192.0.2.250 RewriteCond %{REMOTE_ADDR} ^192\.0\.2\.((1[2-9][0-9])|2[0-4][0-9]|250)$ RewriteRule ^ - [F,L]
给你拆解开看逻辑:
1[2-9][0-9]:匹配120-199的第四段2[0-4][0-9]:匹配200-249的第四段250:单独补全最后一个IP(前面的范围到249)[F,L]:意思是直接返回403禁止访问,并且终止后续规则,不让其他规则干扰
再结合你给出的三个示例场景,直接给可复用的规则
我把每个场景的规则都写死,你对照着改范围就行,一眼就能懂逻辑:
场景1:拦截192.0.2.4 - 192.0.2.12
# 拦截192.0.2.4 - 192.0.2.12 RewriteCond %{REMOTE_ADDR} ^192\.0\.2\.([4-9]|1[0-2])$ RewriteRule ^ - [F,L]
逻辑拆解:
[4-9]:匹配4-9的单个数字IP段1[0-2]:匹配10、11、12- 组合起来刚好覆盖4-12,192.0.2.3或者192.0.2.13绝对不会被误拦
场景2:拦截192.0.2.68 - 192.0.2.103
# 拦截192.0.2.68 - 192.0.2.103 RewriteCond %{REMOTE_ADDR} ^192\.0\.2\.((6[8-9])|([7-9][0-9])|10[0-3])$ RewriteRule ^ - [F,L]
逻辑拆解:
6[8-9]:匹配68、69[7-9][0-9]:匹配70-9910[0-3]:匹配100-103- 完美覆盖68-103,192.0.2.67或者192.0.2.104根本不会被碰
场景3:拦截192.0.2.145 - 192.0.2.222
# 拦截192.0.2.145 - 192.0.2.222 RewriteCond %{REMOTE_ADDR} ^192\.0\.2\.((14[5-9])|(1[5-9][0-9])|(2[0-1][0-9])|22[0-2])$ RewriteRule ^ - [F,L]
逻辑拆解:
14[5-9]:匹配145-1491[5-9][0-9]:匹配150-1992[0-1][0-9]:匹配200-21922[0-2]:匹配220-222- 刚好卡准145-222,半点儿不会越界
最后给你个小技巧,避免踩坑
如果你拿不准自己写的正则对不对,找个在线正则测试工具(比如regex101),把目标IP和非目标IP放进去测——比如测192.0.2.119会不会被120-250的规则匹配(绝对不会),192.0.2.250会不会被匹配(肯定会),测完再放到.htaccess里,稳得一批。
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

