У меня есть какой-то адрес (например: http://example.com/b-out/3456/3212/).This адрес, который я должен пройти через завиток. Я знаю, что этот URL перенаправляет на другой URL (например, HTTP: //sdss.co/go/36a7fe71189fec14c85636f33501f6d2/ ...). И это еще один URL, расположенный в заголовках (расположение) первого URL. Как я могу получить второй URL в некоторой переменной?
Выполните запрос к первому URL-адресу, подтвердите перенаправление и прочитайте заголовок Location. От PHP cURL извлекает заголовки ответа и тело в одном запросе? а также Проверьте заголовки в ответе сервера PHP cURL:
$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-вызове.
Теперь у вас есть заголовки ответа HTTP, без тела, в $redirectResponse
, Теперь вам нужно убедиться, что это перенаправление:
$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()
$responseHeaders
по новой строке HTTP (\r\n
) и найдите заголовок, начинающийся с location
,
Кроме того, вы можете использовать более абстрактную клиентскую библиотеку HTTP лайк Zend_Http_Client
, где немного легче получить заголовки.
Я сделал это, как сказал CodeCaster. Это моя функция ‘getLocationHeader’:
function getLocationHeader($responseHeaders)
{
if (preg_match('/Location:(.+)Vary/is', $redirectResponse, $loc))
{
$location = trim($loc[1]);
return $location;
}
return FALSE;
}