浏览器可加载汇率页面,但curl/file_get_contents触发302重定向求助
为何调用谷歌汇率API时Curl返回302但浏览器正常?
这个问题我之前也碰到过类似情况,核心是服务器端对请求的合法性判断逻辑发生了变化,导致脚本请求和浏览器请求的处理路径不一样。具体原因和解决办法如下:
核心原因分析
- 请求头缺失关键标识:浏览器发起请求时会自动带上一堆请求头(比如
User-Agent、Accept、Accept-Language等),这些信息会让服务器认为这是正常的浏览器访问。而默认的curl或file_get_contents请求头非常简陋,谷歌的服务器可能把它识别为爬虫或非合法请求,直接返回302重定向。 - Cookie会话验证:当你用浏览器访问该页面时,谷歌会给你的浏览器设置会话Cookie,后续请求带上这些Cookie后,服务器会认定这是一个已建立的合法会话。但
curl默认不会保存和携带Cookie,每次请求都是全新的会话,服务器可能会引导你到重定向页面完成验证。 - IP/地区路由差异:谷歌的服务器可能会根据请求的IP地址或地区做不同的路由策略。你的服务器IP可能被归到了需要重定向的分组,而你本地浏览器的IP则没有这个限制。
解决办法
针对这些原因,你可以调整curl的配置来模拟浏览器请求:
1. 模拟完整的浏览器请求头
在curl中添加常见的浏览器请求头,让服务器认为这是正常的浏览器访问。
2. 启用Cookie的保存与复用
通过CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE选项,让curl保存并复用Cookie,模拟浏览器的会话状态。
3. 开启自动跟随重定向
虽然浏览器访问时没有看到重定向,但可能服务器端有隐性的重定向逻辑,开启CURLOPT_FOLLOWLOCATION让curl自动跟随。
下面是完整的curl示例代码:
$url = 'http://finance.google.co.uk/finance/converter?a=1&from=EUR&to=GBP'; // 初始化curl $ch = curl_init($url); // 设置返回结果不直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 模拟Chrome浏览器的User-Agent curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 添加常用的请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ]); // 保存Cookie到文件,下次请求复用 curl_setopt($ch, CURLOPT_COOKIEJAR, './google_cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, './google_cookie.txt'); // 自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 设置最大重定向次数,防止死循环 curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 执行请求 $response = curl_exec($ch); // 检查错误 if(curl_errno($ch)){ echo 'Curl错误: ' . curl_error($ch); } // 关闭curl curl_close($ch); // 输出结果 echo $response;
额外提醒
需要注意的是,谷歌的这个汇率页面属于非官方API,谷歌随时可能调整其访问策略,甚至停止支持这类非授权调用。如果你的业务依赖汇率数据,长期来看建议使用官方的汇率服务或者其他稳定的第三方API,避免后续再次出现类似问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

