apache rewritecond 不支持 cidr,但可通过正则匹配内网ip段实现白名单:先用mod_remoteip获取真实ip,再用^10.、^172.(1[6-9]|2[0-9]|3[0-1]).、^192.168.等正则判断,结合e=allowed标记与[f]拒绝未授权访问。

Apache 的 RewriteCond 本身不直接支持 CIDR 网段匹配(比如 192.168.10.0/24),但它可以通过组合服务器变量和正则表达式,间接实现对特定内网 IP 段的识别与白名单放行。关键在于:先提取客户端真实 IP(注意代理场景),再用正则判断是否落在目标网段范围内。
先确保拿到真实的客户端 IP
如果 Apache 前有 Nginx、CDN 或负载均衡器,%{REMOTE_ADDR} 是代理地址而非用户真实 IP。必须用 %{HTTP:X-Forwarded-For} 或 %{HTTP:X-Real-IP},并配合 mod_remoteip 模块做可信头解析。否则规则会失效或误判。
- 启用
mod_remoteip并配置RemoteIPHeader X-Forwarded-For和RemoteIPTrustedProxy - 确认后,
%{REMOTE_ADDR}就是真实客户端 IP,可直接用于条件判断
用正则匹配常见内网网段(如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)
Apache 的 RewriteCond 支持 ^ 和 $ 锚点,适合做前缀匹配。以下写法可安全识别标准私有地址段:
-
RewriteCond %{REMOTE_ADDR} ^10\.→ 匹配 10.x.x.x 全部地址 -
RewriteCond %{REMOTE_ADDR} ^172\.(1[6-9]|2[0-9]|3[0-1])\.→ 精确匹配 172.16.0.0–172.31.255.255 -
RewriteCond %{REMOTE_ADDR} ^192\.168\.→ 匹配所有 192.168.x.x - IPv6 内网段如
fd00::/8可用RewriteCond %{REMOTE_ADDR} ^fd[0-9a-f]{2}:
组合白名单逻辑:允许内网 + 拒绝其余
典型做法是“放行符合条件的请求,其余统一拦截”。注意规则顺序和 [F] 的使用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先写白名单条件,用
[OR]连接多个网段(避免重复写多条 RewriteCond) - 再接一条
RewriteRule,对不满足白名单的请求返回 403 - 示例配置:
RewriteEngine On
# 白名单:允许 10.x.x.x、172.16–31.x.x、192.168.x.x 访问 /admin
RewriteCond %{REMOTE_ADDR} ^10\. [OR]
RewriteCond %{REMOTE_ADDR} ^172\.(1[6-9]|2[0-9]|3[0-1])\. [OR]
RewriteCond %{REMOTE_ADDR} ^192\.168\.
RewriteRule ^/admin - [E=ALLOWED:1]
<h1>若未设置 ALLOWED 环境变量,则拒绝</h1><p>RewriteCond %{ENV:ALLOWED} !^1$
RewriteRule ^/admin - [F]</p>这里用环境变量 E=ALLOWED:1 标记放行状态,比嵌套 !... 更清晰可靠。
搭配 Require ip 实现双保险(推荐高敏路径)
仅靠 RewriteCond 做白名单不够健壮,建议在 <location></location> 或 <directory></directory> 块中叠加 Apache 原生 IP 权限控制:
- Apache 2.4+ 写法:
<location>
Require ip 10.0.0.0/8
Require ip 172.16.0.0/12
Require ip 192.168.0.0/16
Require all denied
</location>这种写法更规范、更易维护,且不受重写引擎启停影响。RewriteCond 更适合做动态判断(比如结合 Header 或路径参数),而基础网段控制优先走 Require ip。










