【发布时间】: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_FOLLOWLOCATION是false时(尝试设置为(boolean) false,而不是0,但不要认为这很重要),Location:不被尊重。您甚至可以尝试将CURLOPT_MAXREDIRS设置为(int) 0。如果一切都失败了,我建议使用SSCCE 进行更新。