【问题标题】:PHP cURL redirects to localhostPHP cURL 重定向到本地主机
【发布时间】:2013-02-02 10:12:01
【问题描述】:

我正在尝试使用带有 cURL 的 php 脚本登录到外部网页。我是 cURL 的新手,所以我觉得我错过了很多东西。我找到了一些示例并对其进行了修改以允许访问 https 页面。最终,我的目标是能够登录到页面并在登录后按照指定的链接下载.csv。到目前为止,我拥有的是一个测试登录到页面的脚本;脚本如下所示:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.websiteurl.com/login');
curl_setopt($ch, CURLOPT_POSTFIELDS,'Email='.urlencode($login_email).'&Password='.urlencode($login_pass).'&submit=1');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_REFERER, "https://www.websiteurl.com/login");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);

我有几个问题。首先,这是否有理由不自行重定向?我查看页面内容的唯一方法是

echo $output

即使 CURLOPT_RETURNTRANSFER 和 CURLOPT_FOLLOWLOCATION 都设置为 True。

其次,页面的 URL 停留在“localhost/folderName/test.php”,而不是指向实际的网站。谁能解释为什么会这样?因为脚本实际上并没有重定向到登录的网页,所以我似乎无法做任何我需要做的事情。

我的问题与 cookie 有关吗?我的 cookies.txt 文件与我的 .php 脚本位于同一个文件夹中。 (顺便说一句,我正在使用 wampServer )。它应该位于其他地方吗?

一旦我能够解决这两个问题,似乎我需要做的就是重定向到启动 .csv 文件下载过程的链接。

感谢您的帮助,非常感谢!

【问题讨论】:

    标签: php redirect curl login localhost


    【解决方案1】:

    回答部分问题:

    来自http://php.net/manual/en/function.curl-setopt.php

    CURLOPT_RETURNTRANSFER TRUE 将传输作为字符串返回 curl_exec() 的返回值,而不是直接输出。

    换句话说 - 完全按照您的描述进行。它会将响应返回到一个字符串,您可以echo 来查看它。根据要求...

    ----- 编辑-----

    至于你问题的第二部分 - 当我将脚本的最后三行更改为

    $output = curl_exec($ch);
    header('Location:'.$website);
    echo $output;
    

    显示的页面地址更改为$website - 在我的情况下,这是我用来存储我的等价物'https://www.websiteurl.com/login'的变量

    我不确定这是否是您想要做的 - 因为我不确定我是否了解您的下一步是什么。如果您被登录站点重定向,新地址不会是返回的标头的一部分吗?您是否不需要提取该地址以执行下一个请求(wget 或其他)以下载您想要获取的文件?

    为此,您需要将 CURLOPT_HEADER 设置为 TRUE,

    您可以从

    获取您最终到达的 URL
    $last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
    

    (见cURL , get redirect url to a variable)。

    相同的链接还有一个有用的脚本,用于完全解析标头信息(CURLOPT_HEADER==true 时返回。它在 nico limpica 的答案中。

    底线:如果您将浏览器指向特定站点,CURL 会获取您的浏览器会收到的信息;这并不意味着您的浏览器的行为就像您将其指向该站点...

    【讨论】:

    • 太好了,谢谢!我刚刚回到文档,您在我更改帖子之前回答了那部分!
    • 嗨,我已经阅读了您发布的内容,当我重定向到网站(登录后应该去的地方)时,它会将我发送到登录页面,就好像我没有已登录。因此,我得到的输出之间似乎存在脱节,这使我看起来好像我已登录,并实际登录到网站。澄清一下,我想要做的是能够登录到网站,然后自动下载特定文件(通过以登录用户身份导航到该网站上的链接)。
    • 现在我了解您对 cookie 的评论...您是否尝试查看手动登录时创建了哪些 cookie?在您的 curl 请求之后,您是否也看到了同样的情况?
    • stackoverflow.com/questions/12689182/… 提出了类似的问题 - 也许他们的解决方案适合您?
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 2017-05-17
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2013-06-27
    相关资源
    最近更新 更多