我们正在编写一个脚本,检查系统中的链接是否存在无效的状态代码。例如,有人在我们的网站上创建了一个页面,并用链接填充,但多年后,一些网址不正确(4xx / 5xx状态代码)。
检查链接是否有效,我已经制作了一个卷曲片段来获取状态代码。由于链接的数量,我使用curl_multi_exec来运行异步。
但是,现在我遇到了问题。如果网址的状态代码为3xx,则表示存在重定向。在那种情况下,我要关注"真实" url并获取该状态码。 PHP有一个卷曲选项:CURLOPT_FOLLOWLOCATION
。
问题在于:当存在重定向时,服务器会返回正确的状态码,并且URL不正确。我们必须更新" origin"的状态代码。具有"目的地"的状态代码的URL URL。
例如: 让我们说http://example.com重定向到http s :// example.com 在这种情况下,我们会收到http s :// 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();
添加网址:
$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);
所以,基本上:我想收到原始网址而不是目标网址。这可能吗?
答案 0 :(得分:0)
你需要让CURL使用CURLOPT_RETURNTRANSFER返回标题,并自己查找重定向指令。这在这里描述: