apache需借助mod_maxminddb模块解析ip地理位置,流程为加载geolite2数据库→提取iso国家码→用setenvif标记区域→通过require策略控制访问。

Apache 本身不直接支持按国家或地区识别 IP,必须借助外部地理 IP 模块(如 mod_maxminddb)先解析出地理位置信息,再用 SetEnvIf 和 Require 实现访问控制。整个流程分三步:加载地理库 → 提取国家码 → 基于标记做策略。
安装并配置 mod_maxminddb
这是当前最主流、维护活跃的 GeoIP 解析模块,依赖 MaxMind 的 GeoLite2 数据库:
- 安装模块(以 CentOS/RHEL 为例):
yum install mod_maxminddb或从源码编译启用 - 下载 GeoLite2-Country.mmdb 到指定路径,例如
/usr/share/GeoIP/GeoLite2-Country.mmdb - 在 Apache 配置中启用并关联数据库:
MaxMindDBEnable On MaxMindDBFile GEOIP_COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb MaxMindDBEnv GEOIP_COUNTRY_CODE COUNTRY_ISO_CODE
- 重启 Apache:
systemctl reload httpd
用 SetEnvIf 标记目标区域
一旦 GEOIP_COUNTRY_CODE 可用,就能用 SetEnvIf 创建自定义环境变量,比如区分中国及港澳台:
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
SetEnvIf GEOIP_COUNTRY_CODE ^(CN|HK|TW) is_china_regionSetEnvIf GEOIP_COUNTRY_CODE ^(US|CA|GB) is_north_atlantic- 注意:ISO 国家码为大写,正则中无需加
i标志;私有 IP(如 127.0.0.1、192.168.x.x)查不到结果,对应变量为空,不会被匹配
应用访问控制策略
标记只是准备动作,真正生效需配合 <requireall></requireall> 或 Require not env=xxx:
- 仅允许中国区访问某个目录:
<directory><requireall> Require all granted Require env=is_china_region </requireall></directory> - 禁止北美用户访问 API 接口:
<location><requireall> Require all granted Require not env=is_north_atlantic </requireall></location> - 也可组合 IP + 地域,例如“仅中国+内网可访问”:
Require ip 10.0.0.0/8和Require env=is_china_region同时放在<requireall></requireall>中
验证与排错要点
配置后常见问题多源于变量未生成或大小写不一致:
- 检查
GEOIP_COUNTRY_CODE是否真实注入:在日志格式中临时加入%{GEOIP_COUNTRY_CODE}e,查看 access_log 输出 - 确保
AllowOverride All已开启(若用 .htaccess),且mod_setenvif和mod_authz_core已启用 - 拒绝规则生效前,务必确认
Require all granted存在,否则默认全拒 - 测试时建议用非本地公网 IP(如手机热点),避免因私有地址无地理数据导致误判










