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