Google reCAPTCHA v2无响应问题:已定位IPv6故障(PHP on IIS)
解决Google reCAPTCHA v2突然失效的IPv6问题
我之前也碰到过完全一样的情况——代码没动过,reCAPTCHA突然就验证失败了,排查半天发现是IPv6在搞鬼!
问题根源
默认情况下,PHP的file_get_contents会优先使用IPv6去连接目标服务器,但如果你的服务器IPv6配置有问题(比如没有正确的路由、防火墙限制,或者Google的IPv6节点访问不畅),就会导致请求超时或者直接失败,看起来就像reCAPTCHA突然失效了。
具体解决办法
这里给你几个靠谱的方案,按优先级推荐:
1. 强制file_get_contents使用IPv4
修改你的请求代码,通过上下文选项强制绑定到IPv4地址:
// 创建上下文,指定使用IPv4 $context = stream_context_create([ 'socket' => [ 'bindto' => '0.0.0.0:0', ], ]); // 带上上下文发起请求 $response = file_get_contents( "https://www.google.com/recaptcha/api/siteverify?secret=".$privatekey."&response=".$_POST['g-recaptcha-response'], false, $context );
2. 改用CURL请求(更稳定)
CURL的配置更灵活,能明确指定IPv4解析,而且比file_get_contents更适合处理网络请求:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify?secret=".$privatekey."&response=".$_POST['g-recaptcha-response']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); // 强制使用IPv4解析 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 处理可能的跳转 $response = curl_exec($ch); curl_close($ch); // 后续处理验证结果 $verifyResult = json_decode($response, true);
3. 修改服务器hosts文件(临时方案)
如果上面的代码修改不方便,可以在服务器的hosts文件里手动添加Google域名的IPv4地址,绕过DNS的IPv6优先解析:
# 手动指定www.google.com的IPv4地址(示例IP,可通过ping获取最新) 142.250.185.100 www.google.com
不过这个方法需要定期检查IP是否更新,不如代码层面的方案持久。
为什么突然出现这个问题?
大概率是服务器的网络环境变动了——比如你的ISP启用了IPv6但没配置完整,或者Google的DNS解析策略调整,导致PHP优先拿到了IPv6地址,但实际无法正常连接。
内容的提问来源于stack exchange,提问作者Phil Teare
相关产品推荐
相关产品推荐

