【问题标题】:cUrl keeps following location headercUrl 保持跟随位置标头
【发布时间】:2013-11-16 13:35:39
【问题描述】:

好的,我使用 cUrl 将 2 个字段发布到 url,此页面检查我的帖子字段并根据它们返回 cookie。然而,在我什至可以读取 cookie 之前,我已经被重定向到另一个页面。
我尝试设置 _FOLLOWLOCATION, 0 但我仍然被重定向。对此有什么想法吗?
代码:

$headers[] = "Accept: */*";
$headers[] = "Connection: Keep-Alive";
$headers[] = "Content-type: application/x-www-form-urlencoded;charset=UTF-8";

$fields_string = "login_url=/login.do?school=windesheim";
$fields_string=rtrim($fields_string, "&");
$cSession = curl_init(); 
$tmpfname = dirname(__FILE__).'/cookie2.txt';
curl_setopt($cSession, CURLOPT_REFERER,  "https://website.com/login.do?error=nomandant");
curl_setopt($cSession, CURLOPT_HTTPHEADER,  $headers)
curl_setopt($cSession, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($cSession, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($cSession,CURLOPT_URL,"https://website.com/j_spring_security_check");
curl_setopt($cSession,CURLOPT_RETURNTRANSFER,true);
curl_setopt($cSession, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($cSession, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($cSession, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($cSession,CURLOPT_HEADER, true); 
curl_setopt ($cSession, CURLOPT_POST, true);
curl_setopt ($cSession, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($cSession,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$result=curl_exec($cSession);
curl_close($cSession);
echo htmlspecialchars($result);

如果我打印标题,它会显示位置:https://website.com/login.do?error=nomandant

所以我转到此页面,我无法获取 cookie,因为我被重定向到下一页,然后又将我重定向回第一页,因为我没有设置 cookie。 我想进入第一页,不要被重定向,并从标题中读取 cookie。
即使 followlocation 设置为 0/false,我怎么会被重定向?

更新:
当我在 website.com 上的浏览​​器中输入 Windesheim 并将其发布到 /j_spring_security_check

所以我尝试使用 cUrl 使用上面的代码来模拟这个(更新了更多信息)。但输出只有:

HTTP/1.1 302 Found Connection: Keep-Alive Content-Length: 0 
Date: Sat, 16 Nov 2013 14:28:33 GMT 
Location: https://website.com/login.do?error=nomandant Server: Apache-Coyote/1.1

预期的结果类似于上图中的响应标头。
所以出了点问题,它将我重定向到

/login.do?error=nomandant 

而不是

/index.do;jsessionid=etc.

但我不知道我做错了什么,因为只发布了 2 个字段,并且我将它们都包含在我的代码中。

【问题讨论】:

  • 有点不清楚,是你的浏览器被重定向,还是curl会话定义为$cSession?如果是浏览器,肯定还有其他代码在运行,而您没有向我们展示,如果是$cSession...那么...CURLOPT_RETURNTRANSFER 可以工作。你如何检查$result?如果您将其转储到浏览器,请使用echo htmlspecialchars($result);,因此不会执行任何客户端代码。
  • $cSession 正在被重定向。我刚试过 echo htmlspecialchars($result);它给了我相同的输出
  • 另外,当我使用 google chrome 控制台检查页面 /j_spring_security_check 时,它会给出一个状态码:302 Found。即使followlocation设置为false,它是否与重定向有关?
  • 简单明了,当CURLOP_FOLLOWLOCATIONfalse 时(尝试设置为(boolean) false,而不是0,但不要认为这很重要),Location: 不被尊重。您甚至可以尝试将CURLOPT_MAXREDIRS 设置为(int) 0。如果一切都失败了,我建议使用SSCCE 进行更新。

标签: php redirect curl


【解决方案1】:

首先,请注意,在使用 curl_close 关闭会话后,您将能够读取 cookie。

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

根据您所说的,您实际上是被服务器重定向到另一个位置,但 curl 没有跟随该位置。这就是您看到带有重定向的标头的原因。

curl 的行为符合预期!

如果您将其设置为跟随新位置,您将看到 haeder 和页面在新位置 https://website.com/login.do?error=nomandant

鉴于您发布到服务器希望将您发送回 https://website.com/login.do?error=nomandant 的 URL 的数据

如果这不是您所期望的,要么您随请求发送的 cookie 不好(例如缺少会话值...),要么您发布了错误的数据。

【讨论】:

  • 感谢您的回答,您能看看我的更新帖子吗?谢谢!
  • 您没有向website.com/j_spring_security_check 发送它所期望的数据(帖子或cookie)。无法从您的屏幕截图中看出什么。尝试使用 firefox 和 livehttpheaders 插件:您会看到浏览器和服务器之间来回切换的所有内容
  • 它显示相同的数据,login_url 和学校。无论如何感谢您的时间! +1 努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2014-06-23
  • 2016-07-02
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多