You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:10:41