从重定向php

时间:2015-12-01 16:42:16

标签: php curl cookies

好的,我还没有能够找到解决方案,我需要开始提问,以便我可以提高自己的声誉,并希望帮助其他人。

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

在没有cookie的第一次请求时,提供了302个标题,指向第二个页面,该页面还返回指向主页的302重定向。但是,在第二页上,还提供了set-cookie标头,这可以防止主页再次重定向。

但是,当我对网站上的网址发出cURL请求时,它会在重定向循环中失败。

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

我已经找到了如何从2 **代码响应中检索set-cookie标头值,但是当提供302标头时,我似乎无法弄清楚如何访问该值,并且cURL只返回错误。< / p>

即使达到最大(20)重定向,有没有办法访问标题?

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

如何获得此Cookie的值,以便我可以在最终请求中提供?

3 个答案:

答案 0 :(得分:0)

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

尝试在3xx响应中设置Cookie不会在浏览器中保持一致。在Ajax响应中设置cookie不会在浏览器中一致地工作。

  

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

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

首先在iframe中获取主页以填充Cookie并在浏览器中记录您域中的标记。

答案 1 :(得分:0)

我实际上发现了另一个SO问题,当然在我发布之后,这导致我朝着正确的方向发展,HERE

我使用WebGet类来发出curl请求。它已经维持了三年,但它仍然可以正常工作。

它有一个函数可以在不重复直接循环的情况下进行curl请求。

在该函数中设置了很多curl选项,curl没有在其中返回错误,因此我确信确切的解决方案可能更简单。 HERE是任何想要深入研究的人的卷曲选项列表。

以下是我如何处理每个回复以获得最终回复

        $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;

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

答案 2 :(得分:0)

如果您使用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