Можно ли получить исходный URL при использовании CURL multi execute в PHP с указанием местоположения?

Мы создаем скрипт, в котором ссылки в нашей системе проверяются на недопустимые коды состояния. Например, кто-то создает страницу на нашем веб-сайте, заполняет ее ссылками, но по прошествии многих лет некоторые URL-адреса становятся неправильными (коды состояния 4xx / 5xx).

Убедитесь, что ссылка действительна, я сделал фрагмент кода, чтобы получить код состояния. Из-за количества ссылок я использую curl_multi_exec для асинхронного запуска.

Но теперь у меня есть проблема. Если URL имеет код состояния 3xx, это означает, что существует перенаправление. В этом случае я должен перейти к «реальному» URL и получить этот код состояния. В PHP для этого есть опция curl: CURLOPT_FOLLOWLOCATION,

Вот проблема: при перенаправлении сервер возвращает правильный код состояния с неправильным URL. Мы должны обновить код состояния URL-адреса «источника» кодом статуса URL-адреса «назначения».

Например:
Скажем http://example.com перенаправляет на https: //example.com
В этом случае мы получаем код состояния https: //example.com, но мы должны обновить этот код состояния в записи http://example.com.

Вот фрагменты, которые я сделал:

// CURL Options
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER         => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING       => "",
CURLOPT_AUTOREFERER    => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT        => 10,
CURLOPT_NOBODY         => true
);

// Init CURL Multi
$mh = curl_multi_init();

Чтобы добавить URL:

$ch = curl_init(trim($RowFromDatabase->Url));
curl_setopt_array($ch, $options);
curl_multi_add_handle($mh, $ch);

И вот где я запускаю все проверки:

do {
// Run all URL's
while(($exec = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
if($exec != CURLM_OK) {
break;
}

// Get info about URL's
while($ch = curl_multi_info_read($mh)) {
$ch = $ch['handle'];

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$info = curl_getinfo($ch);

// URL (this is the destination URL, I would like to get the origin URL here)
$url = $info['url'];

$broken = false;

if($httpCode >= 400){
$broken = true;
}

if($broken){
// Update broken in database
$QueryBroken->bind_param("s",$url);
$QueryBroken->execute();
}

// Handle
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
} while($running);
curl_multi_close($mh);

Итак, в основном: я хотел бы получить URL-адрес источника вместо URL-адреса назначения. Это возможно?

0

Решение

Вам нужно попросить CURL вернуть заголовки, используя CURLOPT_RETURNTRANSFER, и самостоятельно найти инструкцию по перенаправлению. Это описано здесь:

http://zzz.rezo.net/HowTo-Expand-Short-URLs.html

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector