从重定向php获取set cookie头


Get set-cookie header from redirect php

好吧,我还没能找到解决方案,我需要开始在SO上提问,这样我才能提高自己的声誉,并希望能帮助其他人。

我正在制作一个wordpress插件,用于从远程站点检索json项目列表。最近,该网站添加了一个cookie重定向检查。

在没有cookie的第一次请求时,提供指向第二页面的302报头,第二页面也返回指向主页的302重定向。然而,在第二个页面上,还提供了设置的cookie头,这防止了主页再次重定向。

然而,当我向网站上的url发出cURL请求时,它在重定向循环中失败了。

现在,显然最简单的解决方案是在远程服务器上修复此问题。它不应该实现api路由的重定向。但目前这对我来说不是一个选择

我已经找到了如何从2**代码响应中检索设置的cookie头值,但是,当提供302个头时,我似乎不知道如何访问该值,cURL只返回一个错误。

即使达到最大(20)个重定向,是否有方法访问标头?

是否可以在一定数量的重定向后停止执行?

如何获取此cookie的值,以便在最终请求中提供它?

如果使用cURL选项CURLOPT_HEADER,则从curl_exec返回的数据将包括每个响应的标头,包括302。

如果你在cURL中启用cookie处理,它应该会很好地接收302响应设置的cookie,除非你喜欢手动处理它。

当可能有多个重定向时,我经常做这样的事情:

$ch = curl_init($some_url_that_302_redirects);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // enable curl cookie handling
$result = curl_exec($ch);
// $result contains the headers from each response, plus the body of the last response
$info   = curl_getinfo($ch); // info will tell us how many redirects were followed
for ($i = 0; $i < intval($info['redirect_count']); ++$i) {
    // get headers from each response
    list($headers, $response) = explode("'r'n'r'n", $response, 2);
    // DO SOMETHING WITH $headers HERE
    // If there was a redirect, headers will be all headers from that response,
    // including Set-Cookie headers
}
list($headers, $body) = explode("'r'n'r'n", $response, 2);
// Now $headers are the headers from the final response
// $body is the content from the final response

在开始尝试将cookie添加到混合中之前,您已经遇到了问题。执行单个重定向对性能不利。使用302响应作为将数据表示与HTTP/1,1或更高版本下的数据检索分离的方法是不好的(它有效,但违反了协议-如果您真的必须重定向,则应该使用303)。

尝试在3xx响应中设置cookie不会在浏览器之间一致工作。在Ajax响应中设置cookie不会在浏览器之间一致工作。

它不应该实现api路由的重定向

也许远程网站上的人试图阻止你盗用他们的内容?

首先在iframe中获取主页以填充cookie,并在浏览器上的域中记录一个标志。

我实际上发现了另一个SO问题,当然是在我发帖之后,它引导我朝着正确的方向前进,使之成为可能,点击这里

我使用WebGet类来发出curl请求。它已经三年没有保养了,但仍然运行良好。

它有一个函数,可以在不执行重定向循环的情况下发出curl请求。

这个函数中有很多curl选项,curl不会返回错误,所以我相信确切的解决方案可能更简单。这里有一个卷曲选项列表,供任何想深入研究的人使用。

以下是我如何处理每个响应以获得最终响应

        $w = new WebGet();
        $cookie_file = 'cookie.txt';
        if (!file_exists($cookie_file)) {
            $cookie_file_inter = fopen($cookie_file, "w");
            fclose($cookie_file_inter);
        }
        $w->cookieFile = $cookie_file; // must exist and be writable
        $w->requestContent($url);
        $headers = $w->responseHeaders;
        if ($w->responseStatusCode == 302 && isset($headers['LOCATION'])) {
            $w->requestContent($headers['LOCATION']);
        }
        if ($w->responseStatusCode == 302 && isset($headers['LOCATION'])) {
            $w->requestContent($headers['LOCATION']);
        }
        $response = $w->cachedContent;

当然,这都是非常糟糕的做法,并且具有严重的性能影响,但可能有一些罕见的用例需要这样做。