最近突然有同学反馈说微服务系统新用户无法绑定了,绑定功能是通过curl登录正方教务系统进行用户验证的,经过检查发现是因为新更换了服务器,程序curl登录正方教务系统时无法自动跳转链接。
在php中curl通过设置CURLOPT_FOLLOWLOCATION选项来设置是否自动跟随跳转链接,如果该选项为true或1则自动跳转,否则不会自动跳转。如果你是新开发的程序,那么首先检查curl代码中是否设置了CURLOPT_FOLLOWLOCATION。
而我这里已经设置了CURLOPT_FOLLOWLOCATION为true,之前也是好用的,那么初步怀疑是服务器中某些设置不兼容导致的。
经过查阅资料发现php中curl确实有一个bug,那就是当服务器开启了安全模式或设置了open_basedir时,CURLOPT_FOLLOWLOCATION配置是不起作用的,一些服务器设置的放跨站攻击就是通过open_basedir实现的。知道了原因就好办了,这里提供两种解决方案:
方案一:
关闭服务器安全模式或者open_basedir设置,这是最简单的做法,不过很多时候我们无法修改服务器的这些设置,那么请看方案二。
方案二:
使用下面的自定义函数执行curl
function curlExec(/* Array */$curlOptions='', /* Array */$curlHeaders='', /* Array */$postFields='')
{
$newUrl = '';
$maxRedirection = 10;
do
{
if ($maxRedirection<1) die('Error: reached the limit of redirections');
$ch = curl_init();
if (!empty($curlOptions)) curl_setopt_array($ch, $curlOptions);
if (!empty($curlHeaders)) curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
if (!empty($postFields))
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
}
if (!empty($newUrl)) curl_setopt($ch, CURLOPT_URL, $newUrl); // redirect needed
$curlResult = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302 || $code == 303 || $code == 307)
{
preg_match('/Location:(.*?)n/', $curlResult, $matches);
$newUrl = trim(array_pop($matches));
curl_close($ch);
$maxRedirection--;
continue;
}
else // no more redirection
{
$code = 0;
curl_close($ch);
}
}
while($code);
return $curlResult;
}
想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » php curl 301无效,php curl 网页不自动跳转,php CURLOPT_FOLLOWLOCATION 选项无效的解决办法
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » php curl 301无效,php curl 网页不自动跳转,php CURLOPT_FOLLOWLOCATION 选项无效的解决办法