【问题标题】:cURL followlocation not working correctlycURL 跟随位置无法正常工作
【发布时间】:2013-03-13 08:33:27
【问题描述】:

我目前正在编写用户必须填写用户名和密码的脚本。然后,当用户登录时,脚本会检查他/她的用户名是否已在我的数据库中注册。如果是这种情况,则用户登录我的外部网站(使用 cURL),如果没有,用户登录我无权访问数据库的其他网站。

if($count==1){
    $curl = curl_init('http://www.myownwebsite.com/');
    curl_setopt ($curl, CURLOPT_POSTFIELDS, "gebruikersnaam=$myusername&wachtwoord=$mypassword");
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_exec($curl);
}
else {
    $curl = curl_init('http://www.differentwebsite.com/');
    curl_setopt ($curl, CURLOPT_POSTFIELDS, "username=$myusername&password=$mypassword");
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_exec($curl);
}

如您所见,我的脚本将行数存储在一个计数变量中,如果查询结果为 1 行,它会登录到我的站点,如果不是,它会登录到另一个站点。用户名和密码检查是在用户登录的实际网站上完成的。

现在我的问题是,我希望它“跟随位置”,或者可以这么说。脚本,就像现在一样,重定向(?)到例如http://www.myownwebsite.com/checklogin.php(checklogin.php 是我在其中使用 cURL 的脚本)。

我尝试使用 followlocation cURL 函数解决此问题,但这样做会给我一个警告:

警告:curl_setopt(): CURLOPT_FOLLOWLOCATION 在启用安全模式或在 ----- 中设置 open_basedir 时无法激活

我使用 phpinfo(); 检查了我的 php.ini function 和 safemode 被关闭,open_basedir 没有值,所以我认为这不是问题。我查找了其他一些可能的解决方案,但到目前为止没有任何帮助我解决这个问题。

如果有任何不清楚的地方,请随时询问。

【问题讨论】:

  • CURLOPT_MAXREDIRS 的值是多少?
  • 脚本中没有 maxredirs,所以我猜它可能是默认值?我需要对它做些什么吗?
  • 如我所见..您正在使用 CURLOPT_POSTFIELDS 但您没有设置 CURLOPT_POST 的值..您是否将其设置在其他地方..?
  • 再次阅读错误信息。到目前为止,您的故障排除没有得到正确的结果,因为您可以打开 safe_mode 或设置 open_basedir。你说两者都不是。请仔细检查失败的具体请求。对于它,它可能不是您在其他地方检查过的。总是对具体的要求进行故障排除,而不是在天空中的其他城堡。 - 参见Php - Debugging Curl
  • @new_developer 错了,CURLOPT_POST 是隐含的。

标签: curl php


【解决方案1】:

您无法通过发送 POST 请求到登录页面使用您的服务器来登录用户。发生的情况是您登录的是您的服务器,而不是用户。

此外,您不能使用 PHP 使用 POST 数据重定向用户。您所能做的就是创建一个带有method="POST"action="http://www.differentwebsite.com/" 的表单,其中隐藏字段usernamepassword,将在页面加载时通过JavaScript 提交。这是您可以输出的页面的简单示例。

<html>
<head>
<script type="text/javascript">
function submit_form()
{
    document.myform.submit();
}
</script>
</head>
<body onload="submit_form();">
    <form method="POST" name="myform" action="http://www.google.com/">
        <input type="hidden" name="username" value="someusername"/>
        <input type="hidden" name="password" value="somepassword"/>
    </form>
</body>
</html>

至于你为什么会重定向用户,是因为你跳过了:

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

所以输出会直接发送给用户。

【讨论】:

  • 嗯,我很困惑。我该如何实施?添加 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);有同样的警告。我知道仅仅添加 RETURNTRANSFER 无论如何都不应该解决它,但你知道。我应该如何使用隐藏字段来实现该表单?
  • 啊,是的,在玩了一会儿之后,我开始工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多