我有一些地址(例如:我必须通过 curl 传递的 http://example.com/b-out/3456/3212/).This 地址。我知道这个 URL 重定向到另一个 URL(比如 http://sdss.co/go/36a7fe71189fec14c85636f33501f6d2/?.. 。)。这个另一个 URL 位于第一个 URL 的标题(位置)中。如何我可以在某个变量中获取第二个 URL 吗?
最佳答案
对第一个 URL 执行请求,确认发生重定向并读取 Location header 。来自 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 调用中返回结果。
现在您已经在 $redirectResponse
中获得了没有正文的 HTTP 响应 header 。您现在需要验证它是否是重定向:
$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 换行符 (\r\n
) 上的 $responseHeaders
并找到 header 从 location
开始。
或者,您可以使用更抽象的 HTTP 客户端库 like Zend_Http_Client
, 在那里获取标题更容易一些。
关于php - 如何从某些 URL 获取 HTTP header (位置)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25864042/