Сначала убедитесь, что это действительный URL-адрес, используя filter_var()
:
<?php
$url = "http://www.example.com/foo.php";
if(!filter_var($url, FILTER_VALIDATE_URL))
{
die('Invalid URL');
}
Затем проанализируйте URL-адрес с помощью parse_url()
и убедитесь, что это HTTP (S):
$p_url = parse_url($url);
if(!$p_url) // couldn't parse URL, since parse_url() cannot recognize it
{
die('Invalid URL');
}
if($p_url['scheme'] != 'http' && $p_url['scheme'] != 'https')
{
die('Invalid protocol (only HTTP(S) is supported)');
}
Наконец, убедитесь, что хост существует и вы можете подключиться к нему. Я решил использовать fsockopen()
здесь, так как он будет проверять имя хоста и порт, при этом фактически не отправляя HTTP-запрос.
$fp = fsockopen($p_url['host'], (isset($p_url['port']) ? $p_url['port'] : 80));
if($fp)
{
echo 'Valid URL';
fclose($fp); // Remember to close the file pointer
}else{
echo 'Invalid server';
}
Обратите внимание, что вы можете отказаться от использования этого метода (в зависимости от того, что вы хотите, чтобы ваше приложение), так как если сервер не работает, это приведет к Invalid server
, даже если сервер может существовать. Альтернативное решение, которое будет проверять только имя хоста с DNS-серверов и вообще не подключаться, использует gethostbyaddr()
и gethostbyname()
:
if(@gethostbyaddr($p_url['host'])) // IP addresses passes this test
{
echo 'Valid URL';
}else{
$host = $p_url['host'];
$addr = gethostbyname($host);
if(!$addr) // Invalid domain name
{
echo 'Invalid domain name';
}else if($host == $addr) // Domain name could not be resolved (i.e. does not exist)
{
echo 'Invalid domain name';
}else{
echo 'Valid URL';
}
}
Ссылки: