WordPress区域流量控制策略详解
WordPress限制地区插件

首页 2025-09-02 16:55:27

作为在后台与亿级并发打了十五年交道的技术负责人,我常被业务部门追问:如何像腾讯会议那样,把某些国家或省份的请求直接挡在门外,却又不必在网关层动刀?今天就把我们内部称为“地理阀门”的方案拆开讲透——全部发生在 WordPress 应用层,零侵入 CDN,零改动 Nginx,只靠一款插件与两条规则,就能把 97% 的异常流量拒之门外。
一、为何不用 WAF?
WAF 做区域封禁,优点是快;缺点是颗粒度粗,同一出口 IP 误杀率高。WordPress 的优势在于它拥有完整的用户上下文:已登录角色、文章类型、甚至 WooCommerce 购物车金额。因此,把“地理”与“业务”绑在一起判断,才能真正做到精细运营。
二、选型:GeoTargeting Lite + MaxMind 数据库
市面插件很多,我们选了 CodeRevolution 出品的 GeoTargeting Lite,原因有三:
  1. 支持 IPv6,且内置自动更新 MaxMind GeoLite2;
  2. 提供短代码与 REST API,方便业务同事自行配置;
  3. 代码完全开源,我们做过一次白盒审计,未发现硬编码回传。
三、落地三步曲
  1. 安装后第一件事:把“MaxMind License Key”填进去,插件会在 wp-content 下生成 geoip-database 目录。记得给 PHP 进程写权限,否则首次同步会 403。
  2. 写一条“重定向规则”做兜底:当访客 IP 属于 CN-XX(业务要求屏蔽的省份)且未匹配登录白名单,则 302 到 /sorry-we-are-closed,再把该地址在搜索引擎层面做 noindex。
  3. 精细化场景:
    • 付费课程只在广东、江苏销售 → 用短代码 【geot country="CN" region="GD,JS"】 … 【/geot】 包住购买按钮;
    • 内部测试站只对深圳办公室开放 → 在 functions.php 加三行判断:若 IP 不在 183.3.0.0/16,直接 wp_die()。
四、踩坑与优化
  1. 缓存穿透:WP Super Cache 会把第一次访问的 HTML 直接缓存,导致后续访客被错误放行。解决:在缓存键里加入国家码,或在 wp-config.php 加 define('GEOT_DEBUG', true)。
  2. MaxMind 更新失败:国内服务器常被 GFW reset。我们在 crontab 里加了一个代理出口,把更新脚本每周日凌晨跑一次。
  3. 性能:插件默认每次 init 钩子查询数据库,并发高时 QPS 掉 8%。我们改写成对象缓存,把国家码塞进 Redis,命中后 0.2 ms 返回。
五、灰度与回滚
任何地理规则上线,先只对 5% 流量生效,观察 24 小时日志;若异常率低于 0.1%,再全量。回滚只需在插件后台把规则状态改为 Draft,30 秒内全部失效,无需重启 PHP-FPM。
总结:把“限制地区”做成插件级能力,本质是“把防火墙策略下沉到业务层”。只要遵守“白名单先行、缓存分离、灰度发布”三条军规,WordPress 一样能跑出企业级安全水位。
——————————
教程:手把手教你用 WordPress 限制地区插件
目标:让来自指定省份或国家的访客无法访问站点,或只能看到特定内容。以下步骤基于 GeoTargeting Lite 免费版,亦可迁移至商业版。
步骤 1 预备环境
  • WordPress ≥ 5.8
  • PHP ≥ 7.4(需启用 curl、mbstring)
  • 服务器可访问 download.maxmind.com(如遇阻断,需自备代理)
步骤 2 安装与激活
a. 后台 → 插件 → 安装插件 → 搜索 “GeoTargeting Lite” → 安装并启用。
b. 启用后左侧菜单会出现 “GeoTargeting” → “Settings”,点击进入。
步骤 3 获取 MaxMind 授权
a. 打开 https://www.maxmind.com/en/geolite2/signup 注册账号。
b. 登录后进入 “My License Key” → “Generate new key”。
c. 勾选 “No” 表示不用于商业再分发,生成后复制 Key。
步骤 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 自行扩展。
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道