rewritecond 无法直接获取真实 ip,必须先用 mod_remoteip 模块将 x-forwarded-for 中的真实 ip 写入 remote_addr;配置 remoteipheader 和 remoteiptrustedproxy 后,%{remote_addr} 才可靠,rewritecond 方可安全使用。

在 Apache 中,RewriteCond 本身**无法直接获取客户端真实 IP**,因为它只能读取 Apache 已解析并暴露的变量(如 %{REMOTE_ADDR}),而该变量默认是上一跳代理的地址(如 127.0.0.1 或负载均衡器 IP),不是用户真实 IP。
必须先让 REMOTE_ADDR 变成真实 IP
否则所有基于 %{REMOTE_ADDR} 的判断都不可靠。核心前提是:Apache 要主动把真实 IP 写入 REMOTE_ADDR,而不是让 RewriteCond 去“提取”或“猜测”。推荐用 mod_remoteip 模块完成这一步:
- 启用模块:
LoadModule remoteip_module modules/mod_remoteip.so - 指定来源头:
RemoteIPHeader X-Forwarded-For - 严格限定可信代理:
RemoteIPTrustedProxy 192.168.10.0/24、RemoteIPTrustedProxy 203.0.113.45(填你前面所有代理设备的出口 IP)
配置生效后,%{REMOTE_ADDR} 就是用户真实 IP,RewriteCond 才能安全使用它。
用 RewriteCond 判断真实 IP 并重定向
确认 mod_remoteip 已正确工作后,可直接用 %{REMOTE_ADDR} 做条件匹配:
- 限制特定地区访问:
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. - 放行白名单 IP:
RewriteCond %{REMOTE_ADDR} !^(10\.0\.1\.5|203\.0\.113\.12)$ - 结合 CIDR 匹配(需 mod_rewrite 2.4.13+):
RewriteCond %{REMOTE_ADDR} ^10\.0\.0\.[0-9]+$(粗略匹配 10.0.0.0/24)
注意:不建议用正则硬匹配大网段,更可靠的做法是配合 mod_authz_host 的 Require ip 做访问控制;重定向场景下,优先保证逻辑清晰、条件明确。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
不推荐:用 RewriteCond 解析 X-Forwarded-For
有人尝试这样写:
❌ 不安全,易被伪造RewriteCond %{HTTP:X-Forwarded-For} ^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})RewriteRule .* - [E=REAL_IP:%1]
问题在于:X-Forwarded-For 是 HTTP 头,任何客户端都能伪造。若未严格限制可信代理,这条规则会把恶意构造的 IP 当真,导致重定向逻辑失效甚至安全风险。只有在完全可控的内网且无外部入口时才考虑临时使用,生产环境务必避免。
补充:多级代理下的注意事项
如果请求链是「用户 → CDN → ALB → Apache」,那么:
- CDN 和 ALB 必须开启并正确追加
X-Forwarded-For(不能覆盖,要追加) -
RemoteIPTrustedProxy必须包含 CDN 回源 IP 段和 ALB 的私有出口 IP,缺一不可 - Apache 日志中
%h字段也会自动变成真实 IP,方便日志分析









