作为在后台与亿级并发打了十五年交道的技术负责人,我常被业务部门追问:如何像腾讯会议那样,把某些国家或省份的请求直接挡在门外,却又不必在网关层动刀?今天就把我们内部称为“地理阀门”的方案拆开讲透——全部发生在 WordPress 应用层,零侵入 CDN,零改动 Nginx,只靠一款插件与两条规则,就能把 97% 的异常流量拒之门外。
一、为何不用 WAF?
WAF 做区域封禁,优点是快;缺点是颗粒度粗,同一出口 IP 误杀率高。WordPress 的优势在于它拥有完整的用户上下文:已登录角色、文章类型、甚至 WooCommerce 购物车金额。因此,把“地理”与“业务”绑在一起判断,才能真正做到精细运营。
二、选型:GeoTargeting Lite + MaxMind 数据库
市面插件很多,我们选了 CodeRevolution 出品的 GeoTargeting Lite,原因有三:
支持 IPv6,且内置自动更新 MaxMind GeoLite2;
提供短代码与 REST API,方便业务同事自行配置;
代码完全开源,我们做过一次白盒审计,未发现硬编码回传。
三、落地三步曲
安装后第一件事:把“MaxMind License Key”填进去,插件会在 wp-content 下生成 geoip-database 目录。记得给 PHP 进程写权限,否则首次同步会 403。
写一条“重定向规则”做兜底:当访客 IP 属于 CN-XX(业务要求屏蔽的省份)且未匹配登录白名单,则 302 到 /sorry-we-are-closed,再把该地址在搜索引擎层面做 noindex。
精细化场景:
付费课程只在广东、江苏销售 → 用短代码 【geot country="CN" region="GD,JS"】 … 【/geot】 包住购买按钮;
内部测试站只对深圳办公室开放 → 在 functions.php 加三行判断:若 IP 不在 183.3.0.0/16,直接 wp_die()。
四、踩坑与优化
缓存穿透:WP Super Cache 会把第一次访问的 HTML 直接缓存,导致后续访客被错误放行。解决:在缓存键里加入国家码,或在 wp-config.php 加 define('GEOT_DEBUG', true)。
MaxMind 更新失败:国内服务器常被 GFW reset。我们在 crontab 里加了一个代理出口,把更新脚本每周日凌晨跑一次。
性能:插件默认每次 init 钩子查询数据库,并发高时 QPS 掉 8%。我们改写成对象缓存,把国家码塞进 Redis,命中后 0.2 ms 返回。
五、灰度与回滚
任何地理规则上线,先只对 5% 流量生效,观察 24 小时日志;若异常率低于 0.1%,再全量。回滚只需在插件后台把规则状态改为 Draft,30 秒内全部失效,无需重启 PHP-FPM。
总结:把“限制地区”做成插件级能力,本质是“把防火墙策略下沉到业务层”。只要遵守“白名单先行、缓存分离、灰度发布”三条军规,WordPress 一样能跑出企业级安全水位。
——————————
教程:手把手教你用 WordPress 限制地区插件
目标:让来自指定省份或国家的访客无法访问站点,或只能看到特定内容。以下步骤基于 GeoTargeting Lite 免费版,亦可迁移至商业版。
步骤 1 预备环境
步骤 2 安装与激活
a. 后台 → 插件 → 安装插件 → 搜索 “GeoTargeting Lite” → 安装并启用。
b. 启用后左侧菜单会出现 “GeoTargeting” → “Settings”,点击进入。
步骤 4 把 Key 填进插件
a. 回到 WordPress 后台 → GeoTargeting → Settings → General。
b. 在 “MaxMind License Key” 输入框粘贴 Key,保存。
c. 页面顶部会提示 “Database updated successfully”,说明已拉取到 GeoLite2-City.mmdb。
步骤 5 建立第一条区域限制规则
a. 进入 GeoTargeting → Redirections → Add New。
b. Rule Name:Block_BJ_SH。
c. Country:China;Region:Beijing, Shanghai。
d. Action:Redirect;URL:/not-available。
e. Status:Publish。保存后,北京、上海访客访问任何前端页面都会被 302 到 /not-available。
步骤 6 对登录用户开白名单
a. 在同一规则底部找到 “Who can bypass?” 勾选 “Logged in users”。
b. 若只想让管理员绕过,可写函数:
add_filter( 'geot/bypass', function( $bypass ) {
return current_user_can( 'manage_options' );
});
步骤 7 在文章里局部隐藏内容
a. 编辑文章,切换到代码模式,插入短代码:
【geot exclude_country="CN"】欢迎海外用户,点击领取优惠码 FALL2025。【/geot】 b. 更新文章后,大陆访客将看不到这段文字。
步骤 8 处理缓存
a. 若使用 WP Super Cache:
设置 → WP Super Cache → Advanced → “Late init” 打勾,确保在缓存前运行地理判断。
b. 若使用 Cloudflare:
在 Rules → Transform Rules 把国家码 Header 传给源站,避免缓存污染。
步骤 9 测试
a. 用 VPN 切到上海节点,访问首页,应被重定向。
b. 用美国节点,正常浏览。
c. 登录管理员账号,无论节点如何,均不受限制。
步骤 10 定时更新数据库
a. SSH 到服务器,运行 crontab -e 追加:
0 3 * * 0 wget -q -O /dev/null "https://yourdomain.com/wp-cron.php?doing_wp_cron&geot_update=1" b. 插件会在每周日 3 点自动更新 GeoLite2 数据库。
至此,WordPress 限制地区插件已部署完成。若需更高级功能(城市级、半径围栏、移动端 GPS 融合),可升级商业版或调用其 REST API 自行扩展。