如何合并.htaccess中的多组IP封禁规则以简化配置
解决.htaccess合并IP封禁规则的问题
嗨,我懂你碰到的麻烦了——你把多个IP段的封禁规则合并成一组RewriteCond后失效,核心原因是Apache的RewriteCond默认采用**AND(与)**逻辑:只有当所有条件同时成立时,才会执行后续的RewriteRule。显然,一个IP不可能同时匹配三个不同的段,所以你的合并写法根本不会触发封禁。
这里给你两种靠谱的合并方案,任选其一就好:
方案一:用[OR]标记实现“或”逻辑
给每个RewriteCond加上[OR]标记(最后一个条件除外),这样只要匹配任意一个IP段就会触发封禁:
RewriteEngine On RewriteCond %{REMOTE_ADDR} ^159\.138 [OR] RewriteCond %{REMOTE_ADDR} ^114\.119\.1 [OR] RewriteCond %{REMOTE_ADDR} ^185\.191\.171 RewriteRule .* - [F,L]
⚠️ 注意:最后一个条件别加[OR],否则会引发逻辑错误(相当于“匹配前三个之一 OR 空条件”,会导致所有请求都被封禁)。
方案二:合并成单个正则表达式
把多个IP段用正则的“或”语法(|)合并成一个条件,写法更简洁:
RewriteEngine On RewriteCond %{REMOTE_ADDR} ^(159\.138|114\.119\.1|185\.191\.171) RewriteRule .* - [F,L]
这个正则的意思是:匹配以159.138、114.119.1或185.191.171开头的IP地址,完美替代原来的多组规则。
额外提示
RewriteEngine On只需要写一次,重复声明不会报错,但完全没必要。- 你的
[F,L]标记用得很对:[F]返回403 Forbidden状态码,[L]表示匹配后停止处理后续规则,避免不必要的资源消耗。 - 如果之后要加单个IP封禁,直接把IP加到正则括号里就行,比如:
^(159\.138|114\.119\.1|185\.191\.171|192\.168\.1\.100)
内容的提问来源于stack exchange,提问作者gnysek




