Я бы настоятельно рекомендовал использовать CURL, но только заголовки без извлечения какого-либо содержимого.
Вот функция, которую я использую, чтобы проверить, является ли данный URL верным и найденным.
function __checkUrl($url)
{
//First checking with pattern whether it is proper or not
$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';
if (preg_match($pattern, $url))
{
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
// grab URL
$output = curl_exec($ch);
// Get response code
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
// Not found?
if ($response_code == '404') {
return false;
} else {
return $newurl;
}
}
else
{
return false;
}
}
С помощью этой функции я сначала проверяю, действительно ли URL действителен для Regex. После этого завить это. Установив для CURLOPT_FOLLOWLOCATION значение true, мы позаботимся о 301 и аналогичных перенаправлениях, но ограничим число no. перенаправлений на 3.
И, наконец, мы возвращаем эффективный URL после всех перенаправлений.
Надеюсь, это поможет.