Мы создаем скрипт, в котором ссылки в нашей системе проверяются на недопустимые коды состояния. Например, кто-то создает страницу на нашем веб-сайте, заполняет ее ссылками, но по прошествии многих лет некоторые 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-адреса назначения. Это возможно?
Вам нужно попросить CURL вернуть заголовки, используя CURLOPT_RETURNTRANSFER, и самостоятельно найти инструкцию по перенаправлению. Это описано здесь:
Других решений пока нет …