在Discuz系统中无需安装插件实现地区IP限制,可通过以下三种方案实现:
【方案一】Nginx地理拦截方案(推荐)
1. 安装GeoIP模块:
- apt install libnginx-mod-http-geoip
复制代码
2. 下载GeoIP数据库:
- mkdir /usr/share/GeoIP
- wget -O /usr/share/GeoIP/GeoIP.dat.gz http://www.dz-x.net/geoip/GeoIP.dat.gz
- gunzip /usr/share/GeoIP/GeoIP.dat.gz
复制代码
3. 修改nginx.conf:
- http {
- geoip_country /usr/share/GeoIP/GeoIP.dat;
- map $geoip_country_code $allowed_country {
- default 0;
- CN 1; # 仅允许中国大陆
- HK 1; # 可选允许香港
- MO 1; # 可选允许澳门
- }
- }
复制代码
4. 站点配置中追加:
- server {
- if ($allowed_country = 0) {
- return 444;
- }
- }
复制代码
【方案二】Apache地理拦截方案
1. 安装mod_geoip:
- apt install libapache2-mod-geoip
复制代码
2. 下载并配置数据库:
- wget -O /usr/share/GeoIP/GeoIP.dat http://www.dz-x.net/geoip/GeoIP.dat
复制代码
3. 虚拟主机配置:
- <IfModule mod_geoip.c>
- GeoIPEnable On
- GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
- SetEnvIf GEOIP_COUNTRY_CODE CN AllowCountry
- SetEnvIf GEOIP_COUNTRY_CODE HK AllowCountry
- SetEnvIf GEOIP_COUNTRY_CODE MO AllowCountry
- Order deny,allow
- Deny from all
- Allow from env=AllowCountry
- </IfModule>
复制代码
【方案三】PHP代码层拦截方案(适合虚拟主机)
在Discuz的入口文件 source/class/class_core.php 顶部添加:
- $ip = $_SERVER['REMOTE_ADDR'];
- $geo = unserialize(file_get_contents("http://www.dz-x.net/geo/?ip=$ip"));
- if(isset($geo['country_code']) && !in_array($geo['country_code'],['CN','HK','MO'])){
- header('HTTP/1.1 403 Forbidden');
- exit('Access Denied');
- }
复制代码
注意事项:
1. 推荐使用Nginx方案,性能损耗最小
2. 代码层方案需定期更新API接口(我们提供永久免费接口)
3. 台湾地区IP在GeoIP数据库中标记为TW,如需屏蔽可在配置中移除相关地区码
4. 以上方案已做CDN兼容处理,可自动识别真实客户端IP
如果需要更精准的IP库或定制化配置规则,可以访问我们技术文档中心获取最新地理拦截方案。对于大规模攻击情况,建议配合我们的智能WAF系统实现动态防护。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |