如何在.htaccess中结合mod_geoip与mod_rewrite,兼顾区域限制与爬虫权限
解决方案:结合地理IP限制与搜索引擎爬虫白名单
核心思路
直接通过IP白名单限制爬虫不可靠(搜索引擎爬虫IP范围广且动态更新),应通过User-Agent识别+地理IP限制结合的方式:优先放行搜索引擎爬虫,再对普通用户做国家访问限制。
具体.htaccess配置
情况1:使用mod_geoip(旧版GeoIP模块)
RewriteEngine On # 优先允许主流搜索引擎爬虫访问 RewriteCond %{HTTP_USER_AGENT} (googlebot|bingbot|slurp|duckduckbot|yandexbot) [NC] RewriteRule ^ - [L] # 限制仅比利时(BE)、荷兰(NL)普通用户访问,其他国家跳转至备用站点 RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(BE|NL)$ RewriteRule ^ https://your-alternative-site.com [R=302,L]
情况2:使用mod_geoip2(新版GeoIP2模块,更推荐)
若服务器部署的是GeoIP2模块,指令略有调整:
RewriteEngine On # 允许搜索引擎爬虫 RewriteCond %{HTTP_USER_AGENT} (googlebot|bingbot|slurp|duckduckbot|yandexbot) [NC] RewriteRule ^ - [L] # 地理IP访问限制 RewriteCond %{ENV:GEOIP2_COUNTRY_CODE} !^(BE|NL)$ RewriteRule ^ https://your-alternative-site.com [R=302,L]
关键注意事项
- 扩展爬虫匹配范围:上述User-Agent列表覆盖主流搜索引擎,若需适配更多爬虫(如苹果生态的
applebot),可直接在括号内补充标识。 - 大小写不敏感匹配:
[NC]标记确保忽略User-Agent的大小写差异,避免漏判。 - 验证搜索控制台访问:配置完成后,在Google搜索控制台使用「URL检查工具」测试实时抓取,确认爬虫可正常获取内容。
- 确认GeoIP模块生效:可创建测试文件
geoip-test.php验证模块运行状态:
<?php // 旧版mod_geoip用这个 echo $_SERVER['GEOIP_COUNTRY_CODE']; // 新版mod_geoip2用这个 // echo $_SERVER['GEOIP2_COUNTRY_CODE']; ?>
访问该文件即可查看当前请求的国家代码,确认模块正常工作。
为何IP白名单方案失效?
搜索引擎爬虫(如Googlebot)的IP范围极大且持续动态更新,手动维护白名单无法覆盖所有有效IP,因此通过User-Agent识别是更可靠的方式。若担心User-Agent被伪造,可额外添加IP反向解析验证增强安全性:
# 验证Googlebot的IP反向解析(可选) RewriteCond %{HTTP_USER_AGENT} googlebot [NC] RewriteCond %{REMOTE_HOST} !\.googlebot\.com$ RewriteCond %{REMOTE_HOST} !\.google\.com$ RewriteRule ^ - [F,L]
内容的提问来源于stack exchange,提问作者reinout baeckelmans
相关产品推荐
相关产品推荐

