如何从某个URL获取HTTP标头(位置)?

时间:2014-09-16 08:31:00

标签: php http curl

我有一些地址(例如:http://example.com/b-out/3456/3212/).This地址我必须通过curl。我知道此网址会重定向到另一个网址(例如http://sdss.co/go/36a7fe71189fec14c85636f33501f6d2/?..。)。这个另一个网址位于标题中第一个URL的(位置)。如何在某个变量中获取第二个URL?

2 个答案:

答案 0 :(得分:1)

对第一个URL执行请求,确认发生重定向并读取Location标头。来自PHP cURL retrieving response headers AND body in a single request?Check headers in PHP cURL server response

$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $url);
curl_setopt($curlHandle, CURLOPT_HEADER, 1);
curl_setopt($curlHandle, CURLOPT_NOBODY, 1);
curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);

$redirectResponse = curl_exec($curlHandle);

此处设置的选项意味着:返回响应标头,不返回响应正文,不要自动跟踪重定向并在exec-call中返回结果。

现在,您已在$redirectResponse中获得了没有正文的HTTP响应标头。您现在需要验证它是否为重定向:

$statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
if ($statusCode == 301 || $statusCode == 302 || $statusCode == 303)
{
    $headerLength = curl_getinfo($curlHandle, CURLINFO_HEADER_SIZE);
    $responseHeaders = substr($redirectResponse, 0, $headerLength);
    $redirectUrl = getLocationHeader($responseHeaders);
}

然后创建一个函数来执行此操作:

function getLocationHeader($responseHeaders)
{

}

在那里,您需要explode() HTTP换行符$responseHeaders\r\n)并找到以location开头的标题。


或者,您可以使用更抽象的HTTP客户端库like Zend_Http_Client,从而更容易获取标头。

答案 1 :(得分:0)

我就像CodeCaster说的那样。这是我的功能' getLocationHeader':      function getLocationHeader($responseHeaders) { if (preg_match('/Location:(.+)Vary/is', $redirectResponse, $loc)) { $location = trim($loc[1]); return $location; } return FALSE; }