Apache 2.4.20 非嵌套If语句实现HTTP重定向排除特定IP求助
Apache 2.4.20 多IP排除的HTTP转HTTPS重定向方案
针对你的Apache版本限制(2.4.20不支持嵌套If),以下两种可行方案可以实现「HTTP请求强制跳转到HTTPS,同时排除指定防火墙保活IP」的需求:
方案1:利用Apache 2.4原生<If>指令(无嵌套)
Apache 2.4的<If>指令支持多条件逻辑运算,无需嵌套即可实现多IP排除。直接通过&&组合多个判断条件:
<If "%{REQUEST_SCHEME} == 'http' && %{REMOTE_ADDR} != '10.156.108.2' && %{REMOTE_ADDR} != '10.156.108.3'"> Redirect permanent / https://your-target-domain.com/ </If>
- 逻辑说明:仅当请求为HTTP协议,且客户端IP不是指定的两个保活IP时,触发永久重定向到HTTPS目标地址。
方案2:使用mod_rewrite(无If依赖)
如果不想依赖<If>指令,用mod_rewrite的多条件判断更稳妥,兼容性更强:
RewriteEngine On # 排除第一个保活IP RewriteCond %{REMOTE_ADDR} !^10\.156\.108\.2$ # 排除第二个保活IP RewriteCond %{REMOTE_ADDR} !^10\.156\.108\.3$ # 判断当前请求为HTTP RewriteCond %{HTTPS} off # 执行重定向 RewriteRule ^(.*)$ https://your-target-domain.com/$1 [R=301,L]
- 逻辑说明:mod_rewrite的
RewriteCond默认是逻辑与关系,只有所有条件都满足时才会执行后续的RewriteRule。这里先排除两个指定IP,再判断是否为HTTP请求,最终完成重定向。
补充说明(为什么之前的写法失败)
- 嵌套If写法:Apache 2.4.26才支持嵌套
<If>结构,你的版本不兼容,所以会失效。 - IP范围写法
[2-3]:这种正则写法是匹配单个字符范围,会错误匹配类似10.156.108.12、10.156.108.23这类IP,无法实现精确排除指定IP的需求。
内容的提问来源于stack exchange,提问作者Eddieturbo
相关产品推荐
相关产品推荐

